关于java的浮点类型处理,一般处理计算会想到使用BigDecemal,但是如果是比较呢?
可能会直接使用==,>等符号直接进行比较运算。可以执行下面的代码查看结果:
public static void main(String[] args) {
computer(2.00023434239f, 2.00023434233f);
System.out.println("--------------------------------");
computer(2.00023f,2.00022f);
}
public static void computer(float f1, float f2) {
System.out.println("使用==比较结果:" + (f1 == f2));
System.out.println("使用Math.abs() > 0比较:" + (Math.abs(f1 - f2) > 0));
System.out.println("使用Math.abs() < 0比较:" + (Math.abs(f1 - f2) < 0));
System.out.println("使用Math.abs() = 0比较:" + (Math.abs(f1 - f2) == 0));
System.out.println("使用>比较:" + (f1 > f2));
System.out.println("使用<比较:" + (f1 < f2));
}
使用==比较结果:true
使用Math.abs() > 0比较:false
使用Math.abs() < 0比较:false
使用Math.abs() = 0比较:true
使用>比较:false
使用<比较:false
--------------------------------
使用==比较结果:false
使用Math.abs() > 0比较:true
使用Math.abs() < 0比较:false
使用Math.abs() = 0比较:false
使用>比较:true
使用<比较:false
结果很奇怪。
为什么第一次调用computer的结果会和想的不一样,但是第二次调用和正常的一样。
可以看到两次调用的参数小数点后的位数不一样,很自然的可以想到是精度的问题。所以使用java的浮点类型进行比较的时候不能直接比较。

断点查看两个参数,可以看到小数点后六位是正确的,之后的精度都丢失了。
float的小数位只有23位,即二进制的23位,能表示的最大的十进制数为2的23次方,即8388608,即十进制的7位,严格点,精度只能百分百保证十进制的6位运算。
double的小数位有52位,对应十进制最大值为4 503 599 627 370 496,这个数有16位,所以计算精度只能百分百保证十进制的15位运算。
参考资料:
https://blog.csdn.net/tianmd_Eric/article/details/79729827
本文探讨了Java中float和double类型的精度限制,通过实例演示了直接比较浮点数可能导致的错误结果,揭示了精度丢失的原因,并提供了正确的比较方法。

1492

被折叠的 条评论
为什么被折叠?



