浮点0.2 + 0.1舍入误差

VDP*_*VDP 0 javascript floating-point

可能重复:
JavaScript的数学是否被破坏?

我遇到了这个四舍五入的问题:

当我这样做:

 .2  + .1 results in 0.30000000000000004
 .7  + .1 results in 0.7999999999999999
1.1  + .1 results in 1.2000000000000002
Run Code Online (Sandbox Code Playgroud)

等等...

谁能解释(详细)为什么?可能是一些二进制舍入的东西.但我真的想知道会发生什么......

Ste*_*non 5

简而言之,因为.2实际上并非如此.2; 它实际上是最接近可表示的双精度数,即

0.200000000000000011102230246251565404236316680908203125.
Run Code Online (Sandbox Code Playgroud)

同样,.1真的

0.1000000000000000055511151231257827021181583404541015625
Run Code Online (Sandbox Code Playgroud)

将这些添加到一起时,结果将再次舍入到最接近的可表示数字,即

0.3000000000000000444089209850062616169452667236328125
Run Code Online (Sandbox Code Playgroud)

最后,当你打印出来时,这个数字会四舍五入到17个十进制数字,给出你观察到的结果.

您的其他示例遵循相同的模式.