JavaScript中的精确财务计算。有什么问题?

JavaScript中的精确财务计算。有什么问题?

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



MMMHUHU
浏览 536回答 3
3回答

浮云间

您应该将小数值缩放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页)。

慕桂英546537

没有“精确”的财务计算这样的事情,因为只有两个小数位数,但这是一个更普遍的问题。在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.76569546sys.puts(m+n); //80.76这样,每次使用Money对象时,它将被表示为四舍五入到两位小数。仍然可以访问未包含的值m.amount。Money.prototype.valueOf()如果您愿意,可以将自己的舍入算法构建到其中。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript