python 小数 - 四舍五入到最接近的整美元(不含分) - 使用 ROUND_HALF_UP

6 投票
2 回答
6144 浏览
提问于 2025-04-16 05:30

我想用 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 个回答

0

我做了这个:

def currenctyUSD(val):
  valint = int(val)
  if float(val) > float(valint):
    valint = valint + 1
  return '{0:.2f}'.format(float(valint));

如果原来的浮点数值大于浮点数(int(val)),那么说明原来的浮点数有一些小数部分,也就是有几分钱 :) 所以我们需要加1。

10

我会尝试以下方法:

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

我看不出有什么特别的理由让人更倾向于选择其中一个解决方案。

撰写回答