【问题标题】:Rounding rules for itemized calculations逐项计算的舍入规则
【发布时间】: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


【解决方案1】:

一般来说,如果你想在后端求和然后取整,你想显示四舍五入的行项目,并且你希望四舍五入的行项目加起来是相同的总数,那么至少有一个行项目可能不得不错误地四舍五入一美分。您唯一的选择是至少打破其中一项要求。一些可能的方法(您应该由熟悉您的司法管辖区/业务的律师负责)包括:

  • 调整后端代码。例如,如果 15% 的小费没有四舍五入到最接近的美分,我个人会觉得这有点令人惊讶。
  • 不显示某些行项目(或者,例如,将税费和小费分组到一行中,以便在分组时总和策略与四舍五入策略匹配)
  • 只需使用前端总额而不是后端总额,将
  • 向最终用户显示额外的精度。
  • 包括一个脚注/常见问题解答,以告知用户潜在的差异。
  • 调整一些订单项以包括缺少的便士。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多