首页 > 解决方案 > 带有小数位数的 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)

该函数np.round接受一个decimals参数,但似乎该函数不接受小数位数,并且总是返回一个小数点为零的数字ceilfloor

当然,我可以将数字乘以10^ndecimals,然后应用下限,最后除以10^ndecimals

new_value = np.floor(old_value * 10**ndecimals) / 10**ndecimals

但我想知道是否有一个内置函数可以做到这一点而无需执行操作。

标签: pythonnumpyfloorceil

解决方案


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)

UPD: 正如@a​​schipfl 所指出的,整个值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)

推荐阅读