日期:2014-05-20  浏览次数:20667 次

《java解惑》中一道怪异的谜题:(2.00-1.10)=?
昨晚看书,书中有这样一句代码:
Java code

System.out.println(2.00-1.10); //数据结果理论上因为0.90


控制台结果理论上因为0.90,但实际输出确实:0.8999999999999999!
我以为是没有声明为DOUBLE类型的原因,就把代码改了下但是结果还是一样:
Java code

double num_1 = 2.00;
double num_2 = 1.10;
System.out.println(num_1-num_2);



看书中的解释,因为是英译中(我都怀疑是用GOOGLE翻译的),有点晦涩!
所以在这里求牛人!

------解决方案--------------------
其实这个问题我也遇到过 有种简单的方法 可以先乘 去掉小数点 做运算然后再除 可以避免 浮点运算

出现这种问题的原因是浮点数值是采用二进制系统表示的,而在系统中无法精确的表示分数1/10。
需要在计算中不含有任何舍入误差,就应该使用BigDecimal类。
将一个类标记为strictfp ,那么这个类中的所有方法都要使用严格的浮点数计算,
将一个方法标记为strictfp,那么这个方法就会使用严格的浮点数计算,
public static strictfp void main(String [] args)
------解决方案--------------------
一道经典的数学恒等式:
1=0.9999999999……

对,你没有看错,中间的是等号而不是约等于。
LZ说的情况类似,自己换算下就知道,0.9换算成二进制是个无限循环小数。要用有限的位数表示它是不可能的,只能取近似值。由于计算机硬件取近似值时用的是去尾法,取得的近似值会略小于真值。因此得到的结果就是0.89999999999。

或者可以换个角度理解:
0.9和0.8999999999……其实是一个数。
------解决方案--------------------
http://www.guokr.com/article/27173/ 请参考如上链接