如何在javascript中计算小数

时间:2014-11-13 12:42:09

标签: javascript

我必须在我的应用程序中使用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 [如预期]。 为什么会发生这种情况以及解决方法是什么。

2 个答案:

答案 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);

这里建议How should I do floating point comparison?

答案 1 :(得分:0)

这是因为这些值没有固定的精度。要解决此问题,请尝试实现Math.Round。

Math.round((0.17 + 0.237 + 0.3) * 1e12) / 1e12