带有小数位数的地板和天花板
floor and ceil with number of decimals
我需要用特定的小数位数对浮点数进行下限。
所以:
2.1235 with 2 decimals --> 2.12
2.1276 with 2 decimals --> 2.12 (round would give 2.13 which is not what I need)
函数 np.round
接受 decimals
参数,但函数 ceil
和 floor
似乎不接受小数位数并且总是 return 一个小数点为零的数字。
当然我可以将数字乘以10^ndecimals
,然后应用floor,最后除以10^ndecimals
new_value = np.floor(old_value * 10**ndecimals) / 10**ndecimals
但我想知道是否有一个内置函数可以在无需执行操作的情况下执行此操作。
如果可以选择正则表达式,您可以尝试一下:
import re
def truncate(n, d):
return float(re.search('\d+\.\d{}'.format(d), str(float(n)))[0])
print(truncate(2.1235, 2))
print(truncate(2.1276, 2))
输出:
2.12
2.12
使用str.split
的另一个解决方案:
def truncate(n, d):
s = str(float(n)).split('.')
return float('{}.{}'.format(s[0], s[1][:d]))
print(truncate(2.1235, 2))
print(truncate(2.1276, 2))
输出:
2.12
2.12
这似乎有效(不需要导入并使用 // 运算符工作,它应该比 numpy 更快,因为它只是 returns 除法的底部):
a = 2.338888
n_decimals = 2
a = ((a*10**n_decimals)//1)/(10**n_decimals)
内置的 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)
更新:
正如@aschipfl 所指出的,对于整数值 np.round
将四舍五入到最接近的偶数,这将导致意想不到的结果,例如my_ceil(11)
将 return 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)
对于 C++ 开发人员或对我有用的通用解决方案:
float a, b;
// a = 2.05
// b = 2
c = (ceil((a-b)*1000))/1000;
我需要用特定的小数位数对浮点数进行下限。
所以:
2.1235 with 2 decimals --> 2.12
2.1276 with 2 decimals --> 2.12 (round would give 2.13 which is not what I need)
函数 np.round
接受 decimals
参数,但函数 ceil
和 floor
似乎不接受小数位数并且总是 return 一个小数点为零的数字。
当然我可以将数字乘以10^ndecimals
,然后应用floor,最后除以10^ndecimals
new_value = np.floor(old_value * 10**ndecimals) / 10**ndecimals
但我想知道是否有一个内置函数可以在无需执行操作的情况下执行此操作。
如果可以选择正则表达式,您可以尝试一下:
import re
def truncate(n, d):
return float(re.search('\d+\.\d{}'.format(d), str(float(n)))[0])
print(truncate(2.1235, 2))
print(truncate(2.1276, 2))
输出:
2.12
2.12
使用str.split
的另一个解决方案:
def truncate(n, d):
s = str(float(n)).split('.')
return float('{}.{}'.format(s[0], s[1][:d]))
print(truncate(2.1235, 2))
print(truncate(2.1276, 2))
输出:
2.12
2.12
这似乎有效(不需要导入并使用 // 运算符工作,它应该比 numpy 更快,因为它只是 returns 除法的底部):
a = 2.338888
n_decimals = 2
a = ((a*10**n_decimals)//1)/(10**n_decimals)
内置的 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)
更新:
正如@aschipfl 所指出的,对于整数值 np.round
将四舍五入到最接近的偶数,这将导致意想不到的结果,例如my_ceil(11)
将 return 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)
对于 C++ 开发人员或对我有用的通用解决方案:
float a, b;
// a = 2.05
// b = 2
c = (ceil((a-b)*1000))/1000;