底数和小数位数

时间:2019-09-23 14:52:43

标签: 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)

函数np.round接受一个decimals参数,但是函数ceilfloor似乎不接受小数,并且始终返回零小数点。

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

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

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

4 个答案:

答案 0 :(得分:1)

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)

答案 1 :(得分:0)

如果可以使用正则表达式,则可以尝试一下:

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

答案 2 :(得分:0)

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

a = 2.338888
n_decimals = 2
a = ((a*10**n_decimals)//1)/(10**n_decimals)

答案 3 :(得分:0)

对于 C++ 开发人员或对我有用的通用解决方案:

float a, b;

// a = 2.05
// b = 2

c = (ceil((a-b)*1000))/1000;