2011-09-24 45 views
2

来源:Pastebin 截图:ImageJavaScript的增加0.000000002来计算

<input alt="Flyer|49.80" type="checkbox" class="price" id="cb3" name="price_3" /> 
<input alt="CMS|199.99" type="checkbox" class="price" id="cb1" name="price_1" /> 

嘿人!

也许有人可以给我一点提示,在我的来源问题。 它增加了0.000000002到我的总和,当增加49.8 + 199.99。

感谢您的任何建议!

+0

看看这个SO问题http://stackoverflow.com/questions/744099/javascript-bigdecimal-library –

+0

可能重复的[Javascript计算错误](http://stackoverflow.com/questions/3138793/javascript-calculation -bug) –

+0

感谢您的回答!解决:summe = String(summe.toFixed(2)); summe = summe.replace(“。”,“,”); –

回答

2
var val = 49.8 + 199.99; 
alert(val.toFixed(2)); 
5

您需要了解how floating point numbers work并将您的答案四舍五入为最接近的两位数字。

简而言之,这就是JavaScript和所有使用浮点数的语言都是如何工作的。你不能“修复”它。你所能做的只是接受浮点数并不精确并处理它。

2

问题是javascript将数字存储为64位浮点数。这意味着有一些增加,其中在十进制数学中增加到100.00的数字将不在浮点数学中。 更多参考链接:

Is floating point math broken?

http://www.scribd.com/doc/5836/What-Every-Computer-Scientist-Should-Know-About-FloatingPoint-Arithmetic

您可以通过100的所有输入相乘,将它们添加,然后比较到10,000避免这种情况。这将起作用,因为2^-52和2^52之间的所有整数都可以用双精度浮点数精确表示,但分数可能不是。 http://en.wikipedia.org/wiki/Double_precision_floating-point_format

另一种方法是滚动自己的小数加法函数以处理数字字符串。

3

是的,正如@duffymo暗示的那样,问题与浮点数有关 - 具体而言,问题的根源(这不是JavaScript的特有问题)是没有办法将0.1映射到有限二进制浮点数