Round up to Second Decimal Place in Python

后端 未结 11 1245
耶瑟儿~
耶瑟儿~ 2020-11-30 07:16

How can I round up a number to the second decimal place in python? For example:

0.022499999999999999

Should round up to 0.03<

11条回答
  •  野性不改
    2020-11-30 07:51

    Updated answer:
    The problem with my original answer, as pointed out in the comments by @jpm, is the behavior at the boundaries. Python 3 makes this even more difficult since it uses "bankers" rounding instead of "old school" rounding. However, in looking into this issue I discovered an even better solution using the decimal library.

    import decimal
    
    def round_up(x, place=0):
        context = decimal.getcontext()
        # get the original setting so we can put it back when we're done
        original_rounding = context.rounding
        # change context to act like ceil()
        context.rounding = decimal.ROUND_CEILING
    
        rounded = round(decimal.Decimal(str(x)), place)
        context.rounding = original_rounding
        return float(rounded)
    

    Or if you really just want a one-liner:

    import decimal
    decimal.getcontext().rounding = decimal.ROUND_CEILING
    
    # here's the one-liner
    float(round(decimal.Decimal(str(0.1111)), ndigits=2))
    >> 0.12
    
    # Note: this only affects the rounding of `Decimal`
    round(0.1111, ndigits=2)
    >> 0.11
    

    Here are some examples:

    round_up(0.022499999999999999, 2)
    >> 0.03
    round_up(0.1111111111111000, 2)
    >> 0.12
    round_up(0.1111111111111000, 3)
    >> 0.112
    
    round_up(3.4)
    >> 4.0
    
    # @jpm - boundaries do what we want
    round_up(0.1, 2)
    >> 0.1
    round_up(1.1, 2)
    >> 1.1
    
    # Note: this still rounds toward `inf`, not "away from zero"
    round_up(2.049, 2)
    >> 2.05
    round_up(-2.0449, 2)
    >> -2.04
    

    We can use it to round to the left of the decimal as well:

    round_up(11, -1)
    >> 20
    

    We don't multiply by 10, thereby avoiding the overflow mentioned in this answer.

    round_up(1.01e308, -307)
    >> 1.1e+308
    

    Original Answer (Not recommended):
    This depends on the behavior you want when considering positive and negative numbers, but if you want something that always rounds to a larger value (e.g. 2.0449 -> 2.05, -2.0449 -> -2.04) then you can do:

    round(x + 0.005, 2)
    

    or a little fancier:

    def round_up(x, place):
        return round(x + 5 * 10**(-1 * (place + 1)), place)
    

    This also seems to work as follows:

    round(144, -1)
    # 140
    round_up(144, -1)
    # 150
    round_up(1e308, -307)
    # 1.1e308
    

提交回复
热议问题