python小数 - 使用ROUND_HALF_UP舍入到最接近的整数美元(无分钱)

时间:2010-10-14 17:07:37

标签: python rounding decimal

我正在尝试使用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以外的其他选项吗?

2 个答案:

答案 0 :(得分:7)

我会尝试以下内容:

>>> 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'))确定舍入结果的 exponent ,因此如果用例如Decimal('0.1')替换它,它将舍入到最接近的十分之一,而不是您将其替换为Decimal('1e1'),它会舍入到10的最接近的倍数。

然后第二次quantize调用只会将额外的两位小数放回来,以便Decimal('2.00')出现而不只是Decimal(2)

如果您愿意,也可以使用to_integral_value方法代替第一次量化调用:

>>> x.to_integral_value(rounding=ROUND_HALF_UP).quantize(Decimal('0.01'))
Decimal('2.00')

我看不出任何有理由偏爱另一种解决方案。

答案 1 :(得分:0)

我这样做了:

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

如果原始浮点值大于float(int(val)),则原始浮点数有一些美分:)所以我们需要加1。