【问题标题】:Python - what is the accepted money calculation technique?Python - 什么是公认的货币计算技术?
【发布时间】:2010-09-30 20:39:35
【问题描述】:

举个例子:

>>> from decimal import Decimal
>>> nrml_price = Decimal('0.59')
>>> discounted = nrml_price / 3  # Taking 2/3 off the price with a coupon
Decimal('0.1966666666666666666666666667')  # Customers don't have fractions of a penny
>>> (nrml_price / 3).quantize(D('0.00'))  # So I quantize to get 2 decimal places
Decimal('0.20')  # Ca fait combien? Cest vingt cents.

问题是我现在从技术上向客户收取的费用超过了预期的价格,尽管不到 3/10 美分,但从技术上讲还是不正确。

我该如何克服这样的问题?我是否将其视为生活中的事实而忽略,还是有一种可接受的方式来做这种事情(例如,总是向客户收取最近的一分钱)?

【问题讨论】:

  • 观看超人 III 或办公空间,了解您应该在这里做什么......
  • 这其实根本不是一个编程问题,因为编程可以提供没有通用的解决方案。您需要向会计师提出这个问题。
  • @San - 办公空间 - 我打算参考一下 :) 不过我不记得是在《超人 3》中。
  • 另一方面,“价格降低 1/3”通常并不意味着“将价格除以 3”。在这种情况下,通过您的四舍五入,折扣 将向上四舍五入为 0.2,得到的价格将是 0.39,客户应该可以接受。
  • 你不是真的在降价 2/3 吗?你将从 60 美分变为 20 美分。如果你这样做,数学会更清晰,更不容易出错:discounted = nrml_price * (1 - discnt_pctg)

标签: python concurrency currency


【解决方案1】:

“有没有公认的方法来做这种事情”

是的。会计师一直都在这样做。

COBOL 在这方面确实做得很好。

Python decimal 包有一堆你在上下文中设置的舍入选项。几乎总是 decimal.ROUND_HALF_DOWN 或 decimal.ROUND_HALF_EVEN 选项是您在上下文中想要的。

在构建这样的零售管理软件时,将制定由真实会计师管理的公司政策,其中指定应该做什么。

询问与该业务线合作的会计师,政策是什么。

【讨论】:

  • @orokusaki:当你进行那个确切的实验时,你学到了什么?
  • 我没有。这就是我问你的原因 - 我给了你 15 分,朝着你的 100k 目标迈进 :)
  • @orokusaki:请接受提示。实际运行实际实验。它只有 4 行代码,你会从运行实验中学到比问几十个类似问题更多的东西。如果我运行实验并发布结果,实际上对你来说价值较小。请实际编写实际实验并实际运行它。这对你很有帮助。你会从中学到比我能给出的任何答案更多的东西。
  • 谢谢,真的很有趣。你知道想到了什么;关于坐在屋顶上的鸡蛋的问题。完全没有公平的方法来决定是向下舍入还是向上舍入。最令人困惑的部分是默认的ROUND_HALF_EVEN,它会向上取整。为什么他们会这样称呼它?现实中只有ROUND_HALF_UPROUND_HALF_DOWN,不是吗?
【解决方案2】:

这里的答案实际上可能更多地取决于您的交易处理器。您的交易处理器是否允许您转移不是整数美分的货币数量?不合理的价值货币金额怎么办?说折扣是正常价格的平方根?

大多数供应商(这里就是你)会简单地四舍五入并保留差额,以整美分为单位。

【讨论】:

    猜你喜欢
    • 2012-03-15
    • 2011-04-27
    • 2019-03-09
    • 2018-11-12
    • 1970-01-01
    • 2013-08-13
    • 2012-03-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多