-1
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 行中返回的值(并通过警报命令验证)数量:10 单价:29 总税:3.48 小计 = 32.48

当我为总变量乘以小计*数量时,总回报:总计:324.79999999999995

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

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

4

7 回答 7

7

这已经被问了十亿次了。

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

于 2011-08-09T22:17:10.173 回答
4

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

看这里:

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

于 2011-08-09T22:18:50.897 回答
3

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

我建议您适当地舍入该值以进行显示。

于 2011-08-09T22:17:52.727 回答
1

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

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

于 2011-08-09T22:19:05.003 回答
1

计算机不能很好地处理二进制的小数,因为在实际数学中,例如在 0.01 和 0.02 之间存在无限数量的值。所以他们需要存储近似值,当你对这些近似值进行算术运算时,结果可能会偏离真实结果。

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

于 2011-08-09T22:24:07.320 回答
1

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

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));

Wherev将被替换为所需的值。

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

于 2011-08-09T22:27:11.367 回答
0

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

于 2011-08-09T22:19:09.077 回答