32.48 * 10 = 324.79999999999995 in javascript calculations

32.48 * 10 = 324.79999999999995 in javascript calculations

本文关键字:79999999999995 in javascript calculations      更新时间:2023-09-26
var quantity = $(this).find('td:eq(2) input').val()*1;
var unitprice = $(this).find('td:eq(3) input').val()*1;
var totaltax = 0;
$(this).find('td:eq(4) input[name^=taxamount]').each(function(){
    totaltax = (totaltax*1)+($(this).val()*1);
});
var subtotal = (unitprice+totaltax);
alert(subtotal+' is unit subtotal, to mulitply by '+quantity);
var total = subtotal*quantity;
$(this).find('td:last').html('$'+total);

在本例中,根据我的DOM,结果都是整数(特别是因为我要确保对值应用*1修饰符,以确保它们是数字,而不是字符串)。

在本例中,这些是在上述代码的前7行中返回的值(并通过alert命令进行验证)数量:10unitprice: 29totaltax: 3.48小计= 32.48

当我将subtotal*quantity乘以总变量时,总收益:总:324.79999999999995

所以在最后,我得到的td:最后填充的是$324.79999999999995,而不是$324.80,这更正确。

我知道这很奇怪。我在不同的地方尝试了各种各样的警报,以确保没有错误等。

这个问题已经问过无数次了。

请阅读:每个计算机科学家都应该知道的浮点算术

您遇到了一个熟悉的浮点值问题:某些值不能用有限的二进制浮点数精确表示。

看到:

如何处理JavaScript中的浮点数精度?

这就是浮点数的工作方式。这里没有什么奇怪的。

这就是浮点运算的乐趣所在——有些以10为基数的小数不能用二进制表示。

http://en.wikipedia.org/wiki/Floating_point Accuracy_problems

计算机不能很好地处理二进制的小数,因为在真正的数学中,从0.01到0.02之间的值实际上是无限多的。所以它们需要存储近似值,当你对这些近似值进行算术运算时,结果可能会与真实结果有一点偏差。

你可以用(Math.round(total*100)/100).toFixed(2);

修复它

正如其他人提到的,这就是它的工作方式。建议的解决的方法如下:

var v = "324.32999999999995";
function roundFloat(n, d) {             
    var a= Math.pow(10, d);             
    var b= Math.round(n * a) / a;
    return b;         
}
$("body").append(roundFloat(v,3));

其中v将被替换为期望的值。

您可以查看工作示例:http://jsfiddle.net/QZXhc/

您可以尝试四舍五入到2位小数作为解决方法