Javascript 浮点算术问题(300.2-300=0.1999…)
说明 所以我写了以下计算:Javascript 浮点算术问题(300.2-300=0.1999…),javascript,Javascript,说明 所以我写了以下计算: var valueWithoutIntegers = value - Math.floor(value); 这个语句似乎做得很好,除了当我有值value=300.2时。所以基本上我有: 0.19999999999998863 = 300.2 - Math.floor(300.2) 因此,我在JavaScript控制台中快速切换: 300.2 - Math.floor(300.0) // gives 0.19999999999998863 300.2 - Math.
var valueWithoutIntegers = value - Math.floor(value);
这个语句似乎做得很好,除了当我有值value=300.2
时。所以基本上我有:
0.19999999999998863 = 300.2 - Math.floor(300.2)
因此,我在JavaScript控制台中快速切换:
300.2 - Math.floor(300.0) // gives 0.19999999999998863
300.2 - Math.floor(300.1) // gives 0.19999999999998863
300.2 - Math.floor(300.0) // gives 0.19999999999998863
300.2 - 300 // gives 0.19999999999998863
300.2 - 300.1 // gives 0.0999999999999659
所以我就像WTF对吗?但是我想,也许我需要帮助物理定律,我是指计算机科学中的浮点运算。所以我在谷歌上搜索了一下,并尝试:
Number((300.2).toFixed(2)) - Number((300.2).toFixed(0)) // gives 0.19999999999998863
Number((300.2).toFixed(2)) - Number((300.2).toFixed(2)) // gives 0, makes sense!
300.2 - Number((300.2).toFixed(0)) // gives 0.19999999999998863
Number(300.2) - Number(300) // gives 0.19999999999998863
哎呀!您可以在JavaScript控制台中随意运行这些语句。我在Google Chrome和本地Node.JS应用程序中运行了它
所以我的问题
- 这个魔法是从哪里来的?我不明白为什么这会是一个角落的情况,我只使用了小数点后的1个数字!不象,200
- 我如何重构我的语句,这样我就不必处理这个或其他边缘情况了
简而言之,让我检查一下:计算机不做十进制数学(除非另有说明),也不能存储无限数字。二进制中的
1/5
就像十进制中的1/7
,你不能准确地表示它们。如果要减去结果,请不要使用toFixed
。只需对结果使用toFixed
。