即使使用缩放值,Javascript 金融浮点也会出现错误

问题描述 投票:0回答:1

据我所知,在 Javascript 中管理资金的最佳实践是将所有值缩放到尽可能低的面额(例如,12.45 美元按 100 缩放并在我们的代码中表示为

1245
,而不是
12.45
),然后在计算时将值四舍五入到最接近的整数。

但是,在计算我们的值时,我们仍然遇到问题。

例如:用户支付 28.75 美元,但使用 30% 折扣

我们这样处理这个问题:

Math.round(2875 * .7)
。但这计算出2012年的结果(不正确)。这是因为:

  • 在现实生活中,
    2875 * .7 = 2012.5
    ,四舍五入到 2013 年
  • 在 Javascript 中,
    2875 * .7 = 2012.4999999999998
    ,四舍五入到 2012 年

防止此类错误的最佳方法是什么?

javascript math floating-point currency
1个回答
2
投票

这里的问题不是浮点数而是固定精度。您可以看到这一点,因为整数运算也会出现同样的问题。任何带有整数运算的分数也会导致错误。

解决方案是您需要正确设计每个操作,并准确了解它正在做什么。这是因为无论是固定精度还是浮动精度,仅以固定精度都无法正确计算一般数学运算。没有通用的一刀切解决方案,因此您必须针对您的特定需求设计解决方案。

在应用折扣的情况下,一种方法是利用折扣值域的知识来按一个因子缩放数字,以避免出现分数,直到准备好最终结果。例如,如果所有折扣都是整数百分比(30%、17%、,但不是 33.33%),那么您可以乘以 100 使它们成为整数(30、17...)而不是分数( .30、.17、……)。然后乘以整数。最后,除以乘数(根据需要进行舍入)。

© www.soinside.com 2019 - 2024. All rights reserved.