我试图使用Decimal.quantize()
来实现以下目标:
对于任何数量的钱,用默认精度的python小数表示,我想使用decimal.ROUND_HALF_UP
对其进行舍入,这样在舍入后它就没有美分了。
例如,给定1.25,我试图获得1.00(表示没有美分)
假设1.49,我试图得到1.00
假设1.50我想得到2.00
假设1.87,我试图得到2.00
如果是2.00我想得到2.00
所以美分有两个范围——0美分到49美分;50美分到99美分49美分以下,我要四舍五入,50美分以上,我要四舍五入。我试图用两个有效的小数位(总是00)得到结果。
我在这里没有任何负面价值要处理。我怎样才能把我的钱凑成我想要的数目?除了quantize
,还有其他选择吗?
最佳答案
我想试试下面的方法:
>>> from decimal import Decimal, ROUND_HALF_UP
>>> x = Decimal('2.47')
>>> x.quantize(Decimal('1'), rounding=ROUND_HALF_UP).quantize(Decimal('0.01'))
Decimal('2.00')
这里的关键部分是第一个调用:
x.quantize(Decimal('1'), rounding=ROUND_HALF_UP)
使用给定的舍入模式将x
舍入到最接近的整数。第一个参数(Decimal('1')
)决定四舍五入结果的指数,因此如果您用例如Decimal('0.1')
替换它,它将四舍五入到最接近的十分之一,而如果您用Decimal('1e1')
替换它,它将四舍五入到最接近的10
的倍数。然后第二个调用将额外的两个小数位放回原来的位置,这样您就可以得到
quantize
而不仅仅是Decimal('2.00')
。如果需要,还可以使用
Decimal(2)
方法代替第一个量化调用:>>> x.to_integral_value(rounding=ROUND_HALF_UP).quantize(Decimal('0.01'))
Decimal('2.00')
我看不出有什么强有力的理由更喜欢哪一种解决方案。