JavaScript乘法不精确

JavaScript乘法不精确,javascript,multiplication,Javascript,Multiplication,我遇到了一个奇怪的问题,我想做一些基本的数学检查。我读过避免浮点数的书,所以我决定将我的数学值与10000相乘,因为我的值可以在0.9到0.0025之间 除了两个值:0.56和0.57之外,其他值都正常工作: var result = 0.57 * 10000 结果是:5699.99999999999,我希望是5700!!0.56也会出错,但所有其他值都是正确的,我在这里遗漏了什么?您在Javascript中的选择(实际上,在大多数语言中)是整数或浮点数。如果你写“0.57”,你就是在强迫它进

我遇到了一个奇怪的问题,我想做一些基本的数学检查。我读过避免浮点数的书,所以我决定将我的数学值与10000相乘,因为我的值可以在0.9到0.0025之间

除了两个值:0.56和0.57之外,其他值都正常工作:

var result = 0.57 * 10000

结果是:5699.99999999999,我希望是5700!!0.56也会出错,但所有其他值都是正确的,我在这里遗漏了什么?

您在Javascript中的选择(实际上,在大多数语言中)是整数或浮点数。如果你写“0.57”,你就是在强迫它进入精度有限的浮点世界

var result = 0.57 * 10000;
alert (Math.round(result));​

如果你想获得绝对的准确度,你需要专门处理整数

Hacky解决方案:
value.toFixed(4).substr(-4).替换(/^0+/,”)

最好的解决方案是使用toFixed(x),并为x设置一个小数位数,该小数位数应始终大于预期结果的小数位数(我通常在那里设置8)

但是,你不应该像kirilloid那样进行黑客攻击,而应该将结果再次转换回数字,以便删除任何不需要的小数。之后,对数字执行您喜欢的任何格式设置

因此,这将返回所需的结果:

var result = +(0.57 * 10000).toFixed(8)
结果将是现在5700

前面的+将“toFixed”的字符串结果再次转换为数字

希望有帮助

编辑2019:

我们似乎不应该相信toFixed,因为: 最好使用以下内容:

function fixRounding(value, precision) {
    var power = Math.pow(10, precision || 0);
    return Math.round(value * power) / power;
}
这在已知范围内有效。因此,最好将数字四舍五入到小于
commonMultiplier
的小数点

> multiply(3, .1)
< 0.3
> multiply(5, .03)
< 0.15
>乘(3,.1)
< 0.3
>乘(5.03)
< 0.15

@jamesalardice著名的戈德堡变奏曲!
> multiply(3, .1)
< 0.3
> multiply(5, .03)
< 0.15