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

标签 javascript floating-point precision

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

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

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

13596/10 = 1359.6

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

我想知道它是否与 float 有关,所以我尝试了以下操作:

13596 * parseFloat(0.1) = 1359.6000000000001

没有。

顺便说一下,这不等于:

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

有人知道这个结果吗?

( Here's the JSFiddle. )

最佳答案

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

例如,使用节点:

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

Node 向您显示 1359.6,但是当您要求更精确时,您会发现实际数字与您看到的不完全相同——它被四舍五入了。 0.1也是如此:

> (0.1).toFixed(20)
'0.10000000000000000555'

通常,当您使用 float 时,您会在显示它们之前接受这种不精确和舍入数字。

有些数字可以精确表示的,但最安全的假设是 float 是不精确的。例如,0.5 可以精确表示:

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

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

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

在其他语言中,整数之间的除法结果是一个整数,但在 JavaScript 中,所有数字都被建模为 float 。

通常,只要您需要精确表示小数,就应该使用小数类型,尽管这在 JavaScript 中不可用。

此外,使用代码 parseFloat(0.1) 也没有意义,因为 0.1 已经是一个 float 。

关于javascript - 为什么 13596*0.1 与 13596/10 不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27107899/

相关文章:

javascript - 如何将不可预测的 JSON 解析成字符串?

javascript - 自动触发列表href链接一一

python - 为什么 float() 会切断尾随零?

c++ - 为什么 `precise`限定符不生效?

java - 使用数值方法进行计算时 float 不准确

.net - Double 和 Decimal 的精度(在 .NET 中)

c - 将 '/' 与 long double 一起使用?

javascript - 为什么 DocumentFragment 会忽略一些附加节点?

javascript - 使用 Dropzone.js 在服务器上删除重命名的文件

c - float_t 有什么意义,什么时候应该使用它?