Python 3中的小数到2位

时间:2011-09-26 19:46:26

标签: python python-3.x decimal currency

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

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

5 个答案:

答案 0 :(得分:28)

使用资金时,您通常希望尽可能晚地限制精度,因此乘法等事项不会聚合舍入误差。在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)

答案 1 :(得分:7)

除了用于舍入操作的常量外,接受的答案大多是正确的。您应该使用ROUND_HALF_UP代替ROUND_05UP进行货币操作。根据{{​​3}}:

  

小数。的 ROUND_HALF_UP

     

从零开始向最近的方向靠近。

     

小数。的 ROUND_05UP

     

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

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

以下是一些例子:

>>> 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

答案 2 :(得分:4)

虚假程序员相信金钱:

  • 货币价值可以存储或表示为浮点。
  • 所有货币的小数精度均为2.
  • 所有ISO 4217定义的货币都有小数精度。
  • 所有货币均在ISO 4217中定义。
  • 黄金不是货币。
  • 我的系统永远不会处理超过2位小数的模糊货币。
  • 如果交易的货币价值为"小"。
  • ,则浮点值可以
  • 系统将始终处理相同的货币(因此我们不会保留货币,只保留货币价值)。
  • 将货币值存储为有符号的长整数将使它们更易于使用,只需在完成所有算术后将它们乘以100即可。
  • 客户永远不会抱怨我的舍入方法。
  • 当我将我的应用程序从语言X转换为语言Y时,我不必验证舍入行为是否相同。
  • 在货币A兑换货币B时,汇率在交易后变得无关紧要。

答案 3 :(得分:1)

解决此问题的一种方法是将货币值存储在美分中作为整数,并且仅在打印值时转换为十进制表示。这称为fixed point arithmetic

答案 4 :(得分:0)

>>> decimal.getcontext().prec = 2
>>> d = decimal.Decimal('2.40')
>>> d/17
Decimal('0.14')

你只需要将精度设置为2(第一行),并且它们将使用不超过2个小数位

仅供比较:

>>> 2.4 / 17
0.1411764705882353