我试图使用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')

我看不出有什么强有力的理由更喜欢哪一种解决方案。

09-25 22:16