我遇到了一个奇怪的问题,我想做一些基本的数学检查。我已阅读以避免浮动数字,所以我决定乘以我的数学值与,因为我的值可以介于0.9和0.0025之间。JavaScript乘法不准确
一切工作正确的,除了两个值:0.56和0.57:
var result = 0.57 * 10000
的结果是:5699.999999999999,我希望5700!而且0.56也会出错,但所有其他值都是正确的,我在这里错过了什么?
我遇到了一个奇怪的问题,我想做一些基本的数学检查。我已阅读以避免浮动数字,所以我决定乘以我的数学值与,因为我的值可以介于0.9和0.0025之间。JavaScript乘法不准确
一切工作正确的,除了两个值:0.56和0.57:
var result = 0.57 * 10000
的结果是:5699.999999999999,我希望5700!而且0.56也会出错,但所有其他值都是正确的,我在这里错过了什么?
您在Javascript中的选择(实际上,在大多数语言中)是整数或浮点数。如果你写的是“0.57”,你就会迫使它进入浮点的世界,而精度是有限的。
如果你想绝对准确,你需要专门用整数工作。
var result = 0.57 * 10000;
alert (Math.round(result));
哈克解决方案:value.toFixed(4).substr(-4).replace(/^0+/, "");
最好的解决办法是使用toFixed(x)和集合X一个小数位数,应始终低于预期的结果小数更多的(我通常把8中)。
但不是黑客 - 作为kirilloid-,你应该将结果再次转换为数字,以便任何不必要的小数点被删除。之后,在数字上执行任何你喜欢的格式。
因此,这将返回所需的结果:
var result = +(0.57 * 10000).toFixed(8)
结果将是现在
的+在前面,“toFixed”的字符串结果再次转换为数字。
希望有帮助!
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
[什么每台计算机科学家应该知道关于浮点运算(http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html) – 2012-04-03 12:31:17
@JamesAllardice著名的戈德堡变化! – kojiro 2012-04-03 12:32:23