我想设计一个带有这些输入/输出的函数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进行一系列浮点比较(容易出错)?
答案 0 :(得分:3)
您是否考虑过使用floor
和ceil
的数学方法?
如果您总想要舍入到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)
此处的想法是,如果up
为True
且int
数值不等于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)
此功能应该完全符合您的要求。