python - 带有小数位数的 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
参数,但似乎该函数不接受小数位数,并且总是返回一个小数点为零的数字ceil
。floor
当然,我可以将数字乘以10^ndecimals
,然后应用下限,最后除以10^ndecimals
new_value = np.floor(old_value * 10**ndecimals) / 10**ndecimals
但我想知道是否有一个内置函数可以做到这一点而无需执行操作。
解决方案
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:
正如@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)
推荐阅读
- docker - 在 M1 ARM64 映像上找不到 Linux 映像上使用的库
- spring - 为列表中的每个 bean 调用 PostConstruct
- r - 如何通过R中的特定列将多行合并为单行
- elastic-stack - 在 Elastic 7.15 中上传经度和纬度 (geo_point) 为空值的文档时出错
- popup - Prestashop 1.6 中的 Modal Bootstrap 4 Popup 应在索引中出现一次
- javascript - 防止 TypeScript 公共函数调用私有函数
- visual-studio - 使用 Github Actions 构建多个 Visual Studio 解决方案
- gradle - gradle 7缺少传递依赖
- javascript - 仅在单击两次后才能激活菜单
- flutter - 接受类实例变量名作为参数