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