Python 3中的小数到2位

Mus*_*aab 15 python currency decimal python-3.x

如何使用decimal模块将小数值保留在2个位置以代表金钱?

我已经设定了精度,并且该死的一切都在附近,并且遇到了失败.

pat*_*rys 34

使用钱时,您通常希望尽可能晚地限制精度,因此乘法之类的事情不会聚合舍入误差.在Python 2和3,你可以.quantize()一个Decimal任意精度你想要的:

unit_price = decimal.Decimal('8.0107')
quantity = decimal.Decimal('0.056')
price = unit_price * quantity
cents = decimal.Decimal('.01')
money = price.quantize(cents, decimal.ROUND_HALF_UP)
Run Code Online (Sandbox Code Playgroud)

  • +1这是最好的建议.将精度全局设置为2位小数是无稽之谈.下一步:"给定一个单位价格(4位小数)和一笔金额(2 dp),确定将购买多少单位(3 dp)".还要考虑您可能正在开发一个软件包,您希望它可以被多个司法管辖区的多个客户使用 - 单位价格中的dp数量和单位数量最好是可配置的. (4认同)
  • 另外我应该补充一点,当地法律通常会为您提供明确的量化点。 (2认同)

kei*_*thb 11

除了用于舍入操作的常量之外,接受的答案大多是正确的.您应该使用ROUND_HALF_UP而不是ROUND_05UP货币操作.根据文件:

小数.ROUND_HALF_UP

    绕到最近的领带远离零.

小数.ROUND_05UP

    如果在向零舍入后的最后一个数字将为0或5,则从零开始舍入; 否则向零舍入.

ROUND_05UP如果百分位数中的数字是5或0,那么使用只会向上舍入(对于正数),这对于货币数学来说是不正确的.

这里有些例子:

>>> from decimal import Decimal, ROUND_05UP, ROUND_HALF_UP
>>> cents = Decimal('0.01')
>>> Decimal('1.995').quantize(cents, ROUND_HALF_UP)
Decimal('2.00')  # Correct
>>> Decimal('1.995').quantize(cents, ROUND_05UP)
Decimal('1.99')  # Incorrect
>>> Decimal('1.001').quantize(cents, ROUND_HALF_UP)
Decimal('1.00')  # Correct
>>> Decimal('1.001').quantize(cents, ROUND_05UP)
Decimal('1.01')  # Incorrect
Run Code Online (Sandbox Code Playgroud)


Coc*_*sin 6

Falsehoods programmers believe about money:

  • Monetary values can be stored or represented as a floating point.
  • All currencies have a decimal precision of 2.
  • All ISO 4217 defined currencies have a decimal precision.
  • All currencies are defined in ISO 4217.
  • Gold is not a currency.
  • My system will never have to handle obscure currencies with more than 2 decimal places.
  • Floating point values are OK if the monetary value of transactions is "small".
  • A system will always handle the same currency (therefore we do not persist the currency, only the monetary value).
  • 将货币值存储为带符号的长整数将使它们更易于使用,只需在完成所有算术运算后将它们乘以100。
  • 客户永远不会抱怨我的取整方法。
  • 当我将应用程序从语言X转换为语言Y时,我不必验证舍入行为是否相同。
  • 在将货币A兑换为货币B时,汇率在交易后变得无关紧要。

  • 尽管这无疑是准确的,但并不能完全回答问题。 (8认同)
  • “所有货币的小数精度均为2” <示例比特币 (2认同)
  • 即使这并不是我非常喜欢的问题的答案! (2认同)
  • 投票是因为要牢记在心。我可以肯定的是,SO不像Wiki,但肯定会在问题的主题上下文中集中很多信息。女巫真是有用;) (2认同)