【发布时间】:2020-07-02 02:45:02
【问题描述】:
在翻阅了几篇 stackoverflow 帖子和许多网站之后,我打算直接向这里的聪明人问这个问题。我们的平台处理税收、折扣等的货币计算。我们目前只关注美元和加元。我们是一家非常标准的商店,在 python 上运行我们的后端服务,在前端,我们在 iOS 和 Andriod 上有一些应用程序。
我们在后端进行所有计算,并使用 python 的decimal 进行所有计算,并在我们的 UI 中显示值或实际处理付款之前进行量化。我们的初始定价通常以美分和整数表示,但最终的值可能会达到小数点后 4 位。这就是有趣的地方。
这是一个基本的例子:
*** These values are calculated in the backed ***
[1a] Price of item (in dollars): $3.75
[1b] Price of item (in cents): 375
[1c] Tax rate: 6.25%
[1d] Calculated tax (in cents): 23.4375 ( = 375 * 6.25%)
[1e] Tip: 15%
[1f] Calculated tip (in cents): 56.2500 ( = 375 * 15%)
[1g] Total (in cents): 454.6875 ( = 375 + 23.4375 + 56.2500)
[1h] Total (in dollars and rounded): $4.55
*** This is visible to user ***
[2a] Price of item (in dollars): $3.75
// Value for [2b] is taken and rounded from value of [1d]
[2b] Tax (in dollars and rounded): $0.23
// Value for [2c] is taken and rounded from value of [1f]
[2c] Tip (in dollars and rounded): $0.56
// Value for [2d] is taken and rounded from value of [1g]
[2d] Total (in dollars and rounded): $4.55
However, if you add [2a], [2b] and [2c], you get:
[2e] 3.75 + 0.23 + 0.56 = 4.54
如您所见,[2e] 和 [1h] 相差了 1 美分。 计算和显示货币金额的最佳方法是什么。
【问题讨论】:
-
您是否在前端(iOS/Android)上再次执行计算?如果这样做,差异可能与用于表示值的类以及与后端相比所使用的舍入规则(向上、向下或截断)有关。
-
@silver:我们不会在前端重新计算。我们只是显示从后端收到的值,但精明的用户可能会发现丢失的一分钱。
-
@HansMusgrave:关于 FE 和 BE 之间的不匹配,您是对的。但是,我们已经在 BE 上多次检查了我们的数学计算,并且所有计算都准确完成,以确保我们不会对用户过度收费(或收费不足)。我们倾向于包括一个常见问题解答来解释可能的差异,但我很想看看是否还有其他创新的解决方案。
-
@HansMusgrave:完美。这是一个很好的验证。我们只是想确保我们的用户不会对丢失或增加的一分钱感到惊讶。我们将在常见问题解答中添加解释。感谢您的快速帮助。我会将这个问题留到另一天,但我可能会将您的评论标记为答案。
-
SGTM。我将我的 cmets 总结为一个答案。我将自己移除 cmets 以防止混乱。
标签: python python-3.x math currency calculation