Sem*_*aki 12 python numpy floor ceil
我需要用特定的小数位数来计算浮点数。
所以:
2.1235 with 2 decimals --> 2.12
2.1276 with 2 decimals --> 2.12 (round would give 2.13 wich is not what I need)
Run Code Online (Sandbox Code Playgroud)
该函数np.round
接受一个decimals
参数,但现在看来,功能ceil
和floor
不接受小数位数的和始终与零个小数返回一个数字。
当然我可以乘以数字10^ndecimals
,然后应用地板,最后除以10^ndecimals
new_value = np.floor(old_value * 10**ndecimals) / 10**ndecimals
Run Code Online (Sandbox Code Playgroud)
但我想知道是否有一个内置函数可以做到这一点而无需进行操作。
Python 内置版本和 numpy 版本的 ceil/floor 都不支持精度。
一个提示是重用轮而不是乘法+除法(应该快得多):
def my_ceil(a, precision=0):
return np.round(a + 0.5 * 10**(-precision), precision)
def my_floor(a, precision=0):
return np.round(a - 0.5 * 10**(-precision), precision)
Run Code Online (Sandbox Code Playgroud)
UPD:
正如@aschipfl 所指出的,对于整数值np.round
将四舍五入到最接近的偶数,这将导致意外结果,例如my_ceil(11)
将返回 12。这是一个更新的解决方案,没有这个问题:
def my_ceil(a, precision=0):
return np.true_divide(np.ceil(a * 10**precision), 10**precision)
def my_floor(a, precision=0):
return np.true_divide(np.floor(a * 10**precision), 10**precision)
Run Code Online (Sandbox Code Playgroud)
这似乎有效(不需要导入并且使用 // 运算符工作,它应该比 numpy 更快,因为它只是返回除法的下限):
a = 2.338888
n_decimals = 2
a = ((a*10**n_decimals)//1)/(10**n_decimals)
Run Code Online (Sandbox Code Playgroud)