【问题标题】:python decimals - rounding to nearest whole dollar (no cents) - with ROUND_HALF_UPpython小数-四舍五入到最接近的整数(无美分)-使用ROUND_HALF_UP
【发布时间】:2010-10-14 17:07:37
【问题描述】:

我正在尝试使用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,还有其他选择吗?

【问题讨论】:

    标签: python rounding decimal


    【解决方案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') 将四舍五入到最接近的 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')
    

    我看不出任何强烈的理由偏爱这两种解决方案。

    【讨论】:

    • 你能解释一下这个流程吗?
    • @chefsmart:会的。等一下。 :)
    • 谢谢。我花了几个小时的大部分时间都在画一个空白!
    【解决方案2】:

    我这样做了:

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

    如果原来的 float 值大于 float(int(val)) 那么原来的 float 有一些美分 :) 所以我们需要加 1。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-17
      • 2012-04-22
      • 1970-01-01
      • 2011-03-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多