пол и потолок с количеством десятичных знаков - PullRequest
4 голосов
/ 23 сентября 2019

Мне нужно напечатать число с плавающей точкой с определенным количеством десятичных знаков.

Итак:

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

Но мне интересно, есть ли встроенная функция, которая делает это без необходимости выполнения операций.

Ответы [ 3 ]

1 голос
/ 23 сентября 2019

Ни встроенная в Python, ни версия numy для точности 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)
0 голосов
/ 23 сентября 2019

Это похоже на работу (не требует импорта и работает с использованием оператора //, который должен быть быстрее, чем numpy, так как он просто возвращает этаж деления):

a = 2.338888
n_decimals = 2
a = ((a*10**n_decimals)//1)/(10**n_decimals)
0 голосов
/ 23 сентября 2019

Если регулярные выражения являются опцией, вы можете попробовать:

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