2012-04-03 59 views
7

我遇到了一个奇怪的问题,我想做一些基本的数学检查。我已阅读以避免浮动数字,所以我决定乘以我的数学值与,因为我的值可以介于0.9和0.0025之间。JavaScript乘法不准确

一切工作正确的,除了两个值:0.56和0.57

var result = 0.57 * 10000 

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

+4

[什么每台计算机科学家应该知道关于浮点运算(http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html) – 2012-04-03 12:31:17

+0

@JamesAllardice著名的戈德堡变化! – kojiro 2012-04-03 12:32:23

回答

3

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

如果你想绝对准确,你需要专门用整数工作。

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

哈克解决方案:value.toFixed(4).substr(-4).replace(/^0+/, "");

11

最好的解决办法是使用toFixed(x)和集合X一个小数位数,应始终低于预期的结果小数更多的(我通常把8中)。

但不是黑客 - 作为kirilloid-,你应该将结果再次转换为数字,以便任何不必要的小数点被删除。之后,在数字上执行任何你喜欢的格式。

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

var result = +(0.57 * 10000).toFixed(8) 

结果将是现在

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

希望有帮助!

0
var multiply = function(a, b) { 
    var commonMultiplier = 1000000; 

    a *= commonMultiplier; 
    b *= commonMultiplier; 

    return (a * b)/(commonMultiplier * commonMultiplier); 
}; 

这在一个已知的范围内工作。因此,将数字四舍五入到小于commonMultiplier的小数点可能是个好主意。

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