JavaScript中精确的财务计算注意什么?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (60)

为了创建跨平台的代码,我想用JavaScript开发一个简单的财务应用程序。所需的计算涉及复利和相对较长的小数。我想知道使用JavaScript进行这种数学运算时应避免什么错误 - 如果可能的话!

提问于
用户回答回答于

您应该将您的小数值缩放100,并将所有货币值代表整个美分。这是为了避免浮点逻辑和算术问题。JavaScript中没有十进制数据类型 - 唯一的数字数据类型是浮点数。因此,通常建议将货币处理为2550美分而不是25.50美元。

考虑到在JavaScript中:

var result = 1.0 + 2.0;     // (result === 3.0) returns true

但:

var result = 0.1 + 0.2;     // (result === 0.3) returns false

该表达式0.1 + 0.2 === 0.3返回false,但幸运的是,浮点整数运算是精确的,因此可以通过缩放1来避免十进制表示错误。

请注意,虽然实数集合是无限的,但只能有限数量(准确地说,18,437,736,874,454,810,627)可以完全用JavaScript浮点格式表示。因此其他数字的表示将是实际数字2的近似值。

1道格拉斯克罗克福德:JavaScript:好的部分:附录A - 可怕的部分(第105页)。 2 David Flanagan:JavaScript:权威指南,第4版:3.1.3浮点文字(第31页)

用户回答回答于

由于只有两位十进制小数位,所以没有“精确”的财务计算这样的事情,但这是一个更普遍的问题。

在JavaScript中,您可以将每个值缩放100,并且Math.round()每次使用时都可以出现分数。

您可以使用一个对象来存储数字,并在其原型valueOf()方法中包含四舍五入。喜欢这个:

sys = require('sys');

var Money = function(amount) {
        this.amount = amount;
    }
Money.prototype.valueOf = function() {
    return Math.round(this.amount*100)/100;
}

var m = new Money(50.42355446);
var n = new Money(30.342141);

sys.puts(m.amount + n.amount); //80.76569546
sys.puts(m+n); //80.76

这样,每次使用Money对象时,都会将其表示为四舍五入至小数点后两位。未包含的值仍然可以通过m.amount

Money.prototype.valueOf()如果你喜欢,你可以建立自己的舍入算法。

扫码关注云+社区

领取腾讯云代金券