带小数位数的地板和天花板

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参数,但现在看来,功能ceilfloor不接受小数位数的和始终与零个小数返回一个数字。

当然我可以乘以数字10^ndecimals,然后应用地板,最后除以10^ndecimals

new_value = np.floor(old_value * 10**ndecimals) / 10**ndecimals
Run Code Online (Sandbox Code Playgroud)

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

Mar*_*rat 8

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)

  • 我不知道。也许是因为其他语言没有它。我同意这会有帮助 (2认同)

tsb*_*555 6

这似乎有效(不需要导入并且使用 // 运算符工作,它应该比 numpy 更快,因为它只是返回除法的下限):

a = 2.338888
n_decimals = 2
a = ((a*10**n_decimals)//1)/(10**n_decimals)
Run Code Online (Sandbox Code Playgroud)