如何在javascript中计算小数

如何在javascript中计算小数,javascript,Javascript,我必须在我的应用程序中使用javascript进行一些小数计算,但是结果 这是出乎意料的 以下声明的结果为1.707[如预期的那样] var total=1.17+0.237+0.3; 另外,当我们添加下面的数字时,我得到0.70700000000001[意外] var total=1.17+0.237+0.3; var totalnew=0.17+0.237+0.3; 此外,表达式(0.1+0.2==0.3)返回false[意外],但(1.1+0.2==1.3)返回true[如预期的那样

我必须在我的应用程序中使用javascript进行一些小数计算,但是结果 这是出乎意料的

以下声明的结果为1.707[如预期的那样]

var total=1.17+0.237+0.3;
另外,当我们添加下面的数字时,我得到0.70700000000001[意外]

var total=1.17+0.237+0.3;
var totalnew=0.17+0.237+0.3;
此外,表达式(0.1+0.2==0.3)返回false[意外],但(1.1+0.2==1.3)返回true[如预期的那样]。
为什么会发生这种情况,解决方法是什么。

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

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

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

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

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

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

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

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

浮点运算是出了名的棘手。基本上,它归结为两个实数之间有无穷多的值,因此不可能在计算机中正确地表示它们

如果要打印号码,我建议:

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);
函数近似相等(a,b,ε){
var absA=Math.abs(a);
var absB=数学abs(b);
var diff=数学绝对值(a-b);
var minNormal=1.175494350820875E-38;
如果(a==b){//,则处理无穷大
返回true;
}else如果(a==0 | | b==0 | | diff

正如这里所建议的那样,浮点运算是出了名的棘手。基本上,它归结为两个实数之间有无穷多的值,因此不可能在计算机中正确地表示它们

如果要打印号码,我建议:

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);
函数近似相等(a,b,ε){
var absA=Math.abs(a);
var absB=数学abs(b);
var diff=数学绝对值(a-b);
var minNormal=1.175494350820875E-38;
如果(a==b){//,则处理无穷大
返回true;
}else如果(a==0 | | b==0 | | diff

正如这里所建议的那样,浮点运算是出了名的棘手。基本上,它归结为两个实数之间有无穷多的值,因此不可能在计算机中正确地表示它们

如果要打印号码,我建议:

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);
函数近似相等(a,b,ε){
var absA=Math.abs(a);
var absB=数学abs(b);
var diff=数学绝对值(a-b);
var minNormal=1.175494350820875E-38;
如果(a==b){//,则处理无穷大
返回true;
}else如果(a==0 | | b==0 | | diff

正如这里所建议的那样,浮点运算是出了名的棘手。基本上,它归结为两个实数之间有无穷多的值,因此不可能在计算机中正确地表示它们

如果要打印号码,我建议:

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);
函数近似相等(a,b,ε){
var absA=Math.abs(a);
var absB=数学abs(b);
var diff=数学绝对值(a-b);
var minNormal=1.175494350820875E-38;
如果(a==b){//,则处理无穷大
返回true;
}else如果(a==0 | | b==0 | | diff

正如这里所建议的那样

这个问题的可能重复可能会有帮助吗?为什么total是正确的,而totalnew不是预期的。这个问题的可能重复可能有帮助吗?为什么total是正确的,而totalnew不是预期的。这个问题的可能重复可能有帮助吗?为什么total是正确的,而totalnew不是预期的。这个问题的可能重复可能有帮助吗?为什么total正确,但totalnew不符合预期。为什么total正确,但totalnew不符合预期。ELI5:因为计算机中不可能有完美的浮点数。有时会有舍入误差,有时则不会。为什么total是正确的,而totalnew不是预期的。ELI5:因为计算机中不可能有完美的浮点数。有时会有舍入错误,有时不会。为什么total正确,但totalnew不符合预期。ELI5:因为计算中不可能有完美的浮点数