python 小数 - 四舍五入到最接近的整美元(不含分) - 使用 ROUND_HALF_UP
我想用 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 分。对于0到49分的,我想向下舍入;对于50分及以上的,我想向上舍入。我想得到的结果是保留两位有效小数(这两位小数总是 00)。
这里我没有负值需要处理。我该如何将我的美元金额四舍五入到我想要的数值?另外,除了 quantize
还有其他选择吗?
2 个回答
我做了这个:
def currenctyUSD(val):
valint = int(val)
if float(val) > float(valint):
valint = valint + 1
return '{0:.2f}'.format(float(valint));
如果原来的浮点数值大于浮点数(int(val)),那么说明原来的浮点数有一些小数部分,也就是有几分钱 :) 所以我们需要加1。
我会尝试以下方法:
>>> 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')
,那么就会四舍五入到最接近的十的倍数。
然后第二个 quantize
调用只是把多出来的两个小数位加回来,这样你得到的结果就是 Decimal('2.00')
,而不是仅仅 Decimal(2)
。
如果你愿意,也可以用 to_integral_value
方法来替代第一个 quantize 调用:
>>> x.to_integral_value(rounding=ROUND_HALF_UP).quantize(Decimal('0.01'))
Decimal('2.00')
我看不出有什么特别的理由让人更倾向于选择其中一个解决方案。