使用JavaScript进行货币操作?

7
我正在使用JavaScript创建一个预算应用程序。我必须让JavaScript执行大部分操作。因此,我有一些控件,用户可以更改类别的所需金额,我的应用程序会显示子类别的新金额。
例如,如果我有以下内容: +汽车 $50.23 - 汽油 $30.25 - 维护 $6.27 - 保险 $10.02 - ...
如果用户将汽车的金额从$50.23更改为$90.00,则其他类别的金额将反映其父级类别中的百分比增加量。
问题是,在进行几次操作后,我会失去精度并且产生一些不良问题。大多数情况下,数字不会按照应该的方式相加。在几次更改汽车金额之后将其设置为0后,其他金额并不总是变为0,并且有时它们会低于0,导致我得到NaN。因此,如果我稍后将汽车更改为大于0的值,我的NaN将保持NaN。
我刚听说有人说JavaScript中的小数是近似值,这是另一个问题。我尝试谷歌搜索以查看是否属实,但找不到任何信息(也许我没有使用正确的术语)。
我相信你们中的一些人遇到过类似的问题,你们有什么建议?
有人建议将原始数字乘以100,然后进行所有操作,但我担心这不会帮助我摆脱失去精度的问题。
你们有什么想法吗?
非常感谢您的帮助!

在JS中,每个数字都是浮点数,但你不应该在2位数字上失去太多精度。除非进行成千上万次或百万次迭代,否则FP舍入不会成为问题。你能展示一下你计算的相关代码吗?我们不需要整个页面,只需要那一小部分即可。 - Marc B
你可能可以创建自己的类,其中包含像美元和分这样的属性(都是整数),并实现自己的操作。 - spacevillain
在JavaScript中,fp加法错误是最常报告的错误。 - jzilla
@MarcB - 不,那不正确。0.1 + 0.2不等于== 0.3,所以即使在这种情况下也会出现这种情况。 - T.J. Crowder
2个回答

13

二进制浮点数在处理小数时表现不佳,因此0.1 + 0.2不等于0.3。这是JavaScript中最常见的 bug,并且这是采用IEEE标准进行二进制浮点数算术运算(IEEE 754)的有意后果。该标准非常适用于许多应用程序,但它违反了你在中学中学到的大多数关于数字的知识。幸运的是,浮点数的整数运算是准确的,因此可以通过缩放来避免十进制表示误差。例如,美元价值可以通过将其乘以100转换为整个美分值。然后可以准确地相加这些美分。可以将总和除以100以将其转换回美元。人们合理地期望计算金钱时结果是精确的。

"JavaScript语言精粹" by Douglas Crockford. 版权所有2008年Yahoo!公司,978-0-596-51774-8。


4

1
这里是更新的 fiddle:http://jsfiddle.net/PfPbt/15/,您可以在其中看到差异和推荐解决方案。 - just-boris

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接