可能的重复:
Java 中的浮点运算不能产生精确的结果
我正在做这个简单的除法,但我得到了一个非常奇怪的输出:
double a = 60/(1.2-1.1);
=> 600.0000000000008
什么时候应该是600。
提前致谢
在 IEEE-754 二进制双精度中,我们需要考虑二进制表示中的 1.1 和 1.2:
1.2 = 0b1.001100110011001100110011001100110011001100110011001100110011...
1.1 = 0b1.000110011001100110011001100110011001100110011001100110011001...
请注意,我们需要无限多个位才能以二进制精确地表示它们。 double 只有 53 位有效位,我们必须截掉数字:
1.2 = 0b1.001100110011001100110011001100110011001100110011001100110011...
1.1 = 0b1.000110011001100110011001100110011001100110011001100110011001...
^ round from here
==>
1.2 ~ 0b1.0011001100110011001100110011001100110011001100110011
(= exactly 1.1999999999999999555910790149937383830547332763671875)
1.1 ~ 0b1.0001100110011001100110011001100110011001100110011010
(= exactly 1.100000000000000088817841970012523233890533447265625)
因此 1.2 - 1.1 为:
1.2 ~ 0b1.0011001100110011001100110011001100110011001100110011
- 1.1 ~ 0b1.0001100110011001100110011001100110011001100110011010
————————————————————————————————————————————————————————————————
0b0.00011001100110011001100110011001100110011001100110010000
(= exactly 0.09999999999999986677323704498121514916419982910156250000)
我们实际上可以准确地计算 60 / 0.0999999999999998667732370449812151491641998291015625 ,这给出
600.0000000000007993605777301137740672368493927467455286920109359612256820927...
^ 16th significant figure
与 OP 的结果匹配
600.0000000000008
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)