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