floor and ceil with number of decimals

痞子三分冷 提交于 2020-06-08 07:55:40

问题


I need to floor a float number with an specific number of decimals.

So:

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)

The function np.round accepts a decimals parameter but it appears that the functions ceil and floor don't accept a number of decimals and always return a number with zero decimals.

Of course I can multiply the number by 10^ndecimals, then apply floor and finally divide by 10^ndecimals

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

But I'm wondering if there's a built-in function that does this without having to do the operations.


回答1:


Neither Python built-in nor numpy's version of ceil/floor support precision.

One hint though is to reuse round instead of multyplication + division (should be much faster):

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)



回答2:


If regular expressions are an option, you can give this a go:

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))

Output:

2.12
2.12

Another solution using 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))

Output:

2.12
2.12



回答3:


This seems to work (needs no import and works using the // operator which should be faster than numpy, as it simply returns the floor of the division):

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


来源:https://stackoverflow.com/questions/58065055/floor-and-ceil-with-number-of-decimals

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!