据我所知,在 Javascript 中管理资金的最佳实践是将所有值缩放到尽可能低的面额(例如,12.45 美元按 100 缩放并在我们的代码中表示为
1245
,而不是 12.45
),然后在计算时将值四舍五入到最接近的整数。
但是,在计算我们的值时,我们仍然遇到问题。
例如:用户支付 28.75 美元,但使用 30% 折扣。
我们这样处理这个问题:
Math.round(2875 * .7)
。但这计算出2012年的结果(不正确)。这是因为:
2875 * .7 = 2012.5
,四舍五入到 2013 年2875 * .7 = 2012.4999999999998
,四舍五入到 2012 年防止此类错误的最佳方法是什么?
这里的问题不是浮点数而是固定精度。您可以看到这一点,因为整数运算也会出现同样的问题。任何带有整数运算的分数也会导致错误。
解决方案是您需要正确设计每个操作,并准确了解它正在做什么。这是因为无论是固定精度还是浮动精度,仅以固定精度都无法正确计算一般数学运算。没有通用的一刀切解决方案,因此您必须针对您的特定需求设计解决方案。
在应用折扣的情况下,一种方法是利用折扣值域的知识来按一个因子缩放数字,以避免出现分数,直到准备好最终结果。例如,如果所有折扣都是整数百分比(30%、17%、等,但不是 33.33%),那么您可以乘以 100 使它们成为整数(30、17...)而不是分数( .30、.17、……)。然后乘以整数。最后,除以乘数(根据需要进行舍入)。