乘法导致不寻常的小数位

时间:2013-01-22 17:37:08

标签: javascript jquery

  

可能重复:
  Is JavaScript’s Floating-Point Math Broken?

我在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":"*"}); 
} 

3 个答案:

答案 0 :(得分:2)

如果您正在使用货币(因为您似乎获得了“价格”ID),您可以通过使用所谓的大号库(例如这个:https://github.com/iriscouch/bigdecimal.js)来获得更好的服务你的数学来控制数学(向上舍入与向下舍入等)。要使一切正常,需要做更多的工作,但是避免Office Space数学场景是值得的。

答案 1 :(得分:1)

所有javascript编号均为IEEE-754 double precision floating points numbers。这意味着他们遭遇四舍五入错误和不精确。

答案 2 :(得分:0)

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

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

var formattedNumber = v.toFixed(2); // this makes a string