向上/向下舍入到2位小数

时间:2016-11-15 15:24:56

标签: python floating-point rounding

我想设计一个带有这些输入/输出的函数f(x : float, up : bool)

# 2 decimals part rounded up (up = True)
f(142.452, True) = 142.46
f(142.449, True) = 142.45
# 2 decimals part rounded down (up = False)
f(142.452, False) = 142.45
f(142.449, False) = 142.44

现在,我知道Python的round内置函数,但它总是向上142.449,这不是我想要的。

有没有办法以更好的pythonic方式执行此操作,而不是使用epsilons进行一系列浮点比较(容易出错)?

3 个答案:

答案 0 :(得分:3)

您是否考虑过使用floorceil的数学方法?

如果您总想要舍入到2位数,那么您可以将要舍入的数字预乘100,然后执行舍入到最接近的整数然后再除以100。

from math import floor, ceil

def rounder(num, up=True):
    digits = 2
    mul = 10**digits
    if up:
        return ceil(num * mul)/mul
    else:
        return floor(num*mul)/mul

答案 1 :(得分:1)

如果您不想使用任何显式函数,也可以执行一些数学逻辑:

def f(num, up):
    num = num * 100
    if up and num != int(num):  # if up and "float' value != 'int' value
        num += 1
    return int(num) / (100.0)

此处的想法是,如果upTrueint数值不等于float值,则将数字增加1.否则它将是与原始号码相同

答案 2 :(得分:0)

math.ceil()向上舍入,math.floor()向下舍入。因此,以下是如何使用它的示例:

import math

def f(x, b):
    if b:
        return (math.ceil(100*x) / 100)
    else:
        return (math.floor(100*x) / 100)

此功能应该完全符合您的要求。