A. 为什么说java的浮点运算危害了普天下的芸芸众生
JAVA在基本 float 类型和包装类 Float 之间,用于比较 NaN 和 -0 的规则是不同的。对于 float 值,比较两个 NaN 值是否相等将会得到 false ,而使用 Float.equals() 来比较两个 NaN Float 对象会得到 true 。造成这种现象的原因是,如果不这样的话,就不可能将 NaN Float 对象用作 HashMap 中的键。类似的,虽然 0 和 -0 在表示为浮点值时,被认为是相等的,但使用 Float.compareTo() 来比较作为 Float 对象的 0 和 -0 时,会显示 -0 小于 0 。
由于无穷大、NaN 和 0 的特殊行为,当应用浮点数时,可能看似无害的转换和优化实际上是不正确的。例如,虽然好象 0.0-f 很明显等于 -f ,但当 f 为 0 时,这是不正确的。还有其它类似的 gotcha。
浮点运算很少是精确的。虽然一些数字(譬如 0.5 )可以精确地表示为二进制(底数 2)小数(因为 0.5 等于 2 -1),但其它一些数字(譬如 0.1 )就不能精确的表示。因此,浮点运算可能导致舍入误差,产生的结果接近【但不等于】您可能希望的结果。
不要用浮点值表示精确值,一些非整数值(如几元和几分这样的小数)需要很精确。浮点数不是精确值,所以使用它们会导致舍入误差。因此,使用浮点数来试图表示象货币量这样的精确数量不是一个好的想法。使用浮点数来进行美元和美分计算会得到灾难性的后果。浮点数最好用来表示象测量值这类数值,这类值从一开始就不怎么精确。
B. JAVA中怎么判断两个浮点数相等
一般情况下: 浮点数的相等 ,可以使用 == 进行比较 . 但是浮点数, 毕竟涉及到精度问题, 如果要考虑精度的问题 ,那么可以使用BigDecimal 类
参考代码
publicclassTest{
publicstaticvoidmain(String[]args){
System.out.println(0.1*3==0.3);//false
System.out.println(0.1*3);//0.30000000000000004
System.out.println(0.3d);//0.3
BigDecimalb1=newBigDecimal("0.1");
BigDecimalb2=newBigDecimal("3");
BigDecimalb3=newBigDecimal("0.3");
BigDecimalb4=b1.multiply(b2);//乘法
if(b4.compareTo(b3)==0){//如果两者比较结果为0,那么就是相等
System.out.println("相等");
}else{
System.out.println("不等");
}
}
}
C. java中的float类型
java中的float类型
.浮点类型
1) 与整数类型一样,同样有固定的表述范围和字段长度,且不受具体的操作系统的影响,保证了Java的跨平台性
2) Java语言中,浮点类型有两种表现形式,分别是:
a. 十进制数形式, 如3.14
b. 科学计数法,如,3.14e2, 3.14e-2, -3.14E2
3) Java语言中,默认的浮点数类型是double,声明float类型的时候,后面必须添加字母f或者F,如3.14F,3.14f
4) Java中两种浮点类型的表述范围:
D. java double和float的区别
1、内存结构
float和double的范围是由指数的位数来决定的。
float的指数位有8位,而double的指数位有11位,分布如下:
float:
1bit(符号位)
8bits(指数位)
23bits(尾数位)
double:
1bit(符号位)
11bits(指数位)
52bits(尾数位)
于是,float的指数范围为-128~+127,而double的指数范围为-1024~+1023,并且指数位是按补码的形式来划分的。
其中负指数决定了浮点数所能表达的绝对值最小的非零数;而正指数决定了浮点数所能表达的绝对值最大的数,也即决定了浮点数的取值范围。
float的范围为-2^128
~
+2^127,也即-3.40e+38
~
+3.40e+38;double的范围为-2^1024
~
+2^1023,也即-1.79e+308
~
+1.79e+308。
2.
精度
float和double的精度是由尾数的位数来决定的。浮点数在内存中是按科学计数法来存储的,其整数部分始终是一个隐含着的“1”,由于它是不变的,故不能对精度造成影响。
float:2^23
=
8388608,一共七位,由于最左为1的一位省略了,这意味着最多能表示8位数:
2*8388608
=
16777216
。有8位有效数字,但绝对能保证的为7位,也即
float的精度为7~8位有效数字
double:2^52
=
4503599627370496,一共16位,同理,
double的精度为16~17位
之所以不能用f1==f2来判断两个数相等,是因为虽然f1和f2在可能是两个不同的数字,但是受到浮点数表示精度的限制,有可能会错误的判断两个数相等!
E. java中为什么long的范围小于float求解答
因为long要存储严格的整数,有严格的范围限制,精度永远为1
float是浮动精度。支持小数,但数值达到一定大的时候,就会出现误差。
当float的值达到一定大小,程序中遇到2个float比较的时候会出现应该相等,但结果不等,或者应该不等却相等的情况。因为float是有误差的
long没有误差,但不能有小数。。
F. java里如何在输出浮点数小数部分为0时自动将小数点和小数部分隐藏
可以直接以浮点数和其强转为整数的数值进行比较,相同则直接取整数,即去掉小数点;
否则,即不同时,原样输出;
PS.