为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

MMMHUHU 2019-08-16 17:24:59
JavaScript中的精确财务计算。有什么问题?为了创建跨平台代码,我想用JavaScript开发一个简单的财务应用程序。所需的计算涉及复合利息和相对较长的十进制数。我想知道在使用JavaScript进行这种类型的数学时要避免哪些错误 - 如果有可能的话!
查看完整描述

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页)


查看完整回答
反对 回复 2019-08-16
?
慕桂英546537

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()如果您愿意,可以将自己的舍入算法构建到其中。


查看完整回答
反对 回复 2019-08-16
  • 3 回答
  • 0 关注
  • 535 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号