引言
当我们进行条件判断时,经常会遇到两个数是否相等的情况,但如果在程序中进行判断一个可以除尽的小数和数学上除出来所得的数是否相等时,就会神奇的发型居然不相等??!
遇到问题
看如下代码
double num5 = 2.7;//2.7
double num6 = 8.1 / 3;//接近2.7
System.out.println(num5);
System.out.println(num6);
if(num5 == num6){
System.out.println("相等");//输出失败
}
输出居然是这样:
分析问题
出现了 2.7 != 8.1 / 3的情况.这段代码没有输出"相等"的原因是浮点数在计算机中的表示并不总是精确的。num6
是通过8.1 / 3
计算得到的,这个计算在理论上应该等于2.7
,但由于浮点数的表示方式,计算结果可能会稍微偏离这个精确值。当你使用==
操作符来比较两个浮点数时,你实际上是在比较它们内部的二进制表示是否完全相同。由于num5
和num6
可能由于上述原因而有微小的差异,所以它们的二进制表示可能不完全相同,导致if(num5 == num6)
的条件不满足。
解决问题
那么如何解决这个问题呢?
以两个数的差值的绝对值,在某个精度范围内判断
double num5 = 2.7;//2.7
double num6 = 8.1 / 3;//接近2.7
System.out.println(num5);
System.out.println(num6);
if(num5 == num6){
System.out.println("相等");//输出失败
}
System.out.println(Math.abs(num5 - num6));
if(Math.abs(num5 - num6) < 0.0001){
System.out.println("差值小于规定精度,认为相等");//成功输出
}
这样就输出成功了
总结:
当我们对运算结果是小数的进行相等判断时要小心
应该以两个数的差值的绝对值,在某个精度范围内判断