3 回答

TA贡献1829条经验 获得超4个赞
您应该将小数值缩放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 Douglas Crockford:JavaScript:好的部分:附录A - 可怕的部分(第105页)。
2 David Flanagan:JavaScript:The Definitive Guide,Fourth Edition:3.1.3 Floating-Point Literals(第31页)。

TA贡献1848条经验 获得超10个赞
没有“精确”的财务计算这样的事情,因为只有两个小数位数,但这是一个更普遍的问题。
在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()如果您愿意,可以将自己的舍入算法构建到其中。
添加回答
举报