-1

可能的重复:
JavaScript 的浮点数学被破坏了吗?

在 javascript 中进行乘法运算时,我遇到了一个奇怪的数学问题。

$(parent).find('#id_deals-' + i + '-quantity').val()

结果 -> 10

$(parent).find('#id_deals-' + i + '-price').val()

结果 -> 3.99

上面两个都像这样相乘:

$(parent).find('#id_deals-' + i + '-price').val() * $(parent).find('#id_deals-' + i + '-quantity').val()

结果 --> 39.900000000000006

为什么会这样?我该怎么做才能将小数位限制为 2 位数字?

是不是因为 10 必须是 10.0 ?但是如何在实际乘法之前自动将我的值转换为这种格式?

更新:根据 syazdani 的回答,我已尝试按照建议实施 bigdecimal:

它没有很好的记录,但我让它像这样工作:

function run(opts) {
    var bd = {"BigDecimal":BigDecimal, "BigInteger":BigInteger, "RoundingMode":RoundingMode};
    var result;
    var ops = {'*': "multiply", '/': "divide", '+': "add", '-': "subtract"};
    var a = new bd.BigDecimal("" + opts.a);
    var b = new bd.BigDecimal("" + opts.b);
    var op = ops[opts.op];
    if (op == "divide") {
        return a.divide(b, 300, bd.RoundingMode.HALF_UP());
    } else {
        return a[op].call(a, b);
    }
}


function multiply(a, b){
    return run({"a":a,"b":b,"op":"*"}); 
} 
4

3 回答 3

2

如果您正在使用货币(因为您似乎获得了“价格”ID),那么使用所谓的大数字库(例如这个:https ://github.com/iriscouch/)可能会更好地为您服务bigdecimal.js)让您的数学控制数学(向上舍入与向下舍入等)。需要做更多的工作才能使所有事情都正确,但避免 Office Space 数学场景是值得的。

于 2013-01-22T17:44:59.570 回答
1

所有 javascript 数字都是IEEE-754 双精度浮点数。这意味着它们会遭受舍入误差和不精确性。

于 2013-01-22T17:39:00.990 回答
0

javascript 中的所有数字都是浮点数,基于IEEE754

如果要将一个格式化为点后具有固定位数的字符串,请使用

var formattedNumber = v.toFixed(2); // this makes a string
于 2013-01-22T17:39:27.227 回答