java double是什么类型(java中float和double的取值范围是什么)
大家好,今天来为大家分享java double是什么类型的一些知识点,和java中float和double的取值范围是什么的问题解析,大家要是都明白,那么可以忽略,如果不太清楚的话可以看看本篇文章,相信很大概率可以解决您的问题,接下来我们就一起来看看吧!
Java中的Long和Double类型
Java中的原子操作包括:
1)除long和double之外的基本类型的赋值操作
2)所有引用reference的赋值操作
3)java.concurrent.Atomic.*包中所有类的一切操作。
但是java对long和double的赋值操作是非原子操作!!long和double占用的字节数都是8,也就是64bits。在32位操作系统上对64位的数据的读写要分两步完成,每一步取32位数据。这样对double和long的赋值操作就会有问题:如果有两个线程同时写一个变量内存,一个进程写低32位,而另一个写高32位,这样将导致获取的64位数据是失效的数据。因此需要使用volatile关键字来防止此类现象。volatile本身不保证获取和设置操作的原子性,仅仅保持修改的可见性。但是java的内存模型保证声明为volatile的long和double变量的get和set操作是原子的。(from
http://www.iteye.com/topic/213794)
举个例子来说:(example is from
http://stackoverflow.com/questions/17481153/long-and-double-assignments-are-not-atomic-how-does-it-matter)
public class UnatomicLong implements Runnable{
private static long test= 0;
private final long val;
public UnatomicLong(long val){
this.val= val;
}
@Override
public void run(){
while(!Thread.interrupted()){
test= val;
//两个线程都试图将自己的私有变量val赋值给类私有静态变量test
}
}
public static void main(String[] args){
Thread t1= new Thread(new
UnatomicLong(-1));
Thread t2= new Thread(new
UnatomicLong(0));
System.out.println(Long.toBinaryString(-1));
System.out.println(pad(Long.toBinaryString(0),
64));
t1.start();
t2.start();
long val;
while((val= test)==-1
|| val== 0){
//如果静态成员test的值是-1或0,说明两个线程操作没有交叉
}
System.out.println(pad(Long.toBinaryString(val), 64));
System.out.println(val);
t1.interrupt();
t2.interrupt();
}
// prepend 0s to the string to make it the target
length
private static String pad(String s, int targetLength){
int n= targetLength- s.length();
for(int x= 0; x< n; x++){
s="0"+ s;
}
return s;
}
}
java中float和double的取值范围是什么
float:4字节(32bit),IEEE 754.取值范围:
[-3.40282346638528860e+38,-1.40129846432481707e-45]∪ [1.40129846432481707e-45~ 3.40282346638528860e+38]。
double: 8字节(64bit),IEEE 754.取值范围:
[-1.79769313486231570e+308,-4.94065645841246544e-324]∪ [4.94065645841246544e-324,1.79769313486231570e+308]。
扩展资料
基本数据类型的特点,位数,最大值和最小值。
1、
基本类型:short二进制位数:16
包装类:java.lang.Short
最小值:Short.MIN_VALUE=-32768(-2的15此方)
最大值:Short.MAX_VALUE=32767(2的15次方-1)
2、
基本类型:int二进制位数:32
包装类:java.lang.Integer
最小值:Integer.MIN_VALUE=-2147483648(-2的31次方)
最大值:Integer.MAX_VALUE= 2147483647(2的31次方-1)
3、
基本类型:long二进制位数:64
包装类:java.lang.Long
最小值:Long.MIN_VALUE=-9223372036854775808(-2的63次方)
最大值:Long.MAX_VALUE=9223372036854775807(2的63次方-1)
4、
基本类型:float二进制位数:32
包装类:java.lang.Float
最小值:Float.MIN_VALUE=1.4E-45(2的-149次方)
最大值:Float.MAX_VALUE=3.4028235E38(2的128次方-1)
5、
基本类型:double二进制位数:64
包装类:java.lang.Double
最小值:Double.MIN_VALUE=4.9E-324(2的-1074次方)
最大值:Double.MAX_VALUE=1.7976931348623157E308(2的1024次方-1)
参考资料:Java官网-Java教程
javafloat和double的区别
float与double的区别
单精度浮点数在机内占4个字节,用32位二进制描述。
双精度浮点数在机内占8个字节,用64位二进制描述。
浮点数在机内用指数型式表示,分解为:数符,尾数,指数符,指数四部分。
数符占1位二进制,表示数的正负。
指数符占1位二进制,表示指数的正负。
尾数表示浮点数有效数字,0.xxxxxxx,但不存开头的0和点
指数存指数的有效数字。
指数占多少位,尾数占多少位,由计算机系统决定。
可能是数符加尾数占24位,指数符加指数占8位-- float.
数符加尾数占48位,指数符加指数占16位-- double.
知道了这四部分的占位,按二进制估计大小范围,再换算为十进制,就是你想知道的数值范围。
对编程人员来说,double和 float的区别是double精度高,有效数字16位,float精度7位。但double消耗内存是float的两倍,double的运算速度比float慢得多,java语言中数学函数名称double和 float不同,不要写错,能用单精度时不要用双精度(以省内存,加快运算速度)
double java默认初值
基本数据类型作为类的成员时,
即使没有对其进行初始化,
java也会确保它有一个默认值,如下:
基本类型的初始值基本类型默认值
boolean false
char\u0000(null)
byte(byte)0
short(short)0
int 0
long 0L
float 0.0f
double 0.0d
上面的默认值,是当变量作为类的成员使用时才有的,
java这样做是保证基本类型的成员变量得到初始化,
防止产生程序错误,
但这些值在实际的程序中可能都是不合理的,
所以最好明确的给出初始值。
上面的默认值对在程序中非成员变量就不适用了,
非成员变量如果不明确给出初始值,就可能是任何值。
在java程序编译时会提示你一个错误,而不是c++中的警告。
至于那些应用类型,像数组,对象啦,有些复杂,根据你的类型而定,对象一般弄人为null,
数组根据你的类型,按照基本数据类型的默认值来初始化……
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/yongpang/archive/2008/01/30/2073765.aspx
关于本次java double是什么类型和java中float和double的取值范围是什么的问题分享到这里就结束了,如果解决了您的问题,我们非常高兴。