为什么13596 * 0.1与13596/10不同?

时间:2014-11-24 15:06:19

标签: javascript floating-point precision

我只是偶然发现了Javascript中非常奇怪的东西。

我的脚本将13596乘以0.1,输出为:1359.6000000000001

我们可以同意0.1 = 1/10,所以我试了一下:

13596/10 = 1359.6

我用Firefox和Chrome测试过,结果相同。

我想知道它是否与浮动有关,所以我尝试了以下内容:

13596 * parseFloat(0.1) = 1359.6000000000001

不。

顺便说一下,这不相等:

(13596*0.1) === (13596/10) => false

有没有人对这个结果有所了解?

Here's the JSFiddle.

1 个答案:

答案 0 :(得分:8)

请记住,对于浮点数,您在屏幕上看到的数字不一定正好计算机正在建模的数字。

例如,使用node

> 1359.6
1359.6
> (1359.6).toFixed(20)
'1359.59999999999990905053'

节点向您展示1359.6,但是当您要求更高精度时,您可以看到实际数字与您看到的不完全相同 - 它是圆形的。 0.1:

也是如此
> (0.1).toFixed(20)
'0.10000000000000000555'

通常,当你使用花车时,你会在显示之前接受这种不精确和圆整的数字。

某些数字 可以完全表示,但最安全的假设是浮点不精确。例如,0.5可以准确表示:

> (0.5).toFixed(20)
'0.50000000000000000000'

除以10实际上会产生与乘以0.1相同的结果:

> 13596/10
1359.6
> (13596/10).toFixed(20)
'1359.59999999999990905053'

在其他语言中,整数之间的除法产生一个整数,但在JavaScript中,所有数字都被建模为浮点。

通常,只要您需要精确表示十进制数字,就应该使用十进制数字类型,但这在JavaScript中本身不可用。

同样没有必要使用代码parseFloat(0.1),因为0.1已经是浮动。