我必须在我的应用程序中使用javascript进行一些小数计算但结果 出人意料。
以下陈述的结果是1.707 [如预期]
var total=1.17+0.237+0.3;
当我们添加下面的数字时,我得到0.7070000000000001 [意外]
var totalnew=0.17+0.237+0.3;
此外,表达式(0.1 + 0.2 === 0.3)返回false [unexpected],但是(1.1 + 0.2 === 1.3)返回true [如预期]。 为什么会发生这种情况以及解决方法是什么。
答案 0 :(得分:3)
漂浮点非常棘手。基本上它归结为两个实数之间存在无限量的值,因此无法在计算机中正确表示它们。
如果你想打印我建议的号码:
total.toFixed();
总会给你三个小数位。当你想检查两个花车是否相同时,你需要做这样的事情:
function nearlyEqual(a, b, epsilon) {
var absA = Math.abs(a);
var absB = Math.abs(b);
var diff = Math.abs(a - b);
var minNormal = 1.1754943508222875e-38;
if (a == b) { // shortcut, handles infinities
return true;
} else if (a == 0 || b == 0 || diff < minNormal) {
// a or b is zero or both are extremely close to it
// relative error is less meaningful here
return diff < (epsilon * minNormal);
} else { // use relative error
return diff / (absA + absB) < epsilon;
}
}
nearlyEqual(0.1+0.2, 0.3, 0.0001);
答案 1 :(得分:0)
这是因为这些值没有固定的精度。要解决此问题,请尝试实现Math.Round。
Math.round((0.17 + 0.237 + 0.3) * 1e12) / 1e12