即使使用缩放值

时间:2017-11-29 11:10:23

标签: javascript math floating-point currency

据我所知,在Javascript中管理资金的最佳做法是表示所有按比例缩放到最低可能面额的值(例如,在我们的代码中,$ 12.45按100缩放并表示为1245,而不是{ {1}}),然后在计算时将值舍入到最接近的整数。

但是,在对我们的值进行计算时,我们仍会遇到问题。

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

我们这样处理:12.45。但这会计算出2012年的结果(不正确)。这是因为:

  • 在现实生活中,Math.round(2875 * .7),即2013年
  • 在Javascript中,2875 * .7 = 2012.5,转向2012年

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

1 个答案:

答案 0 :(得分:1)

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

解决方案是您需要正确设计每个操作,并确切知道它正在做什么。这是因为无论是固定的还是浮动的,都不可能以固定的精度正确地计算一般数学运算。没有通用的“一刀切”解决方案,因此您必须根据自己的特定需求设计解决方案。

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