如何使用decimal
模块将小数点保留在2个位置以代表金钱?
我已经设定了精确度,并且该死的一切都在附近,并且遇到了失败。
答案 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)
虚假程序员相信金钱:
答案 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