Усечение поплавков в Python - PullRequest
90 голосов
/ 24 апреля 2009

Я хочу удалить цифры из числа с плавающей точкой, чтобы иметь фиксированное количество цифр после точки, например:

1.923328437452 -> 1.923

Мне нужно выводить в виде строки в другую функцию, а не печатать.

Также я хочу игнорировать потерянные цифры, а не округлять их.

Ответы [ 28 ]

0 голосов
/ 04 июля 2018

Что-то достаточно простое, чтобы вписаться в понимание списка, без библиотек или других внешних зависимостей. Для Python> = 3.6 очень просто писать с помощью f-строк.

Идея состоит в том, чтобы позволить преобразованию строк выполнить округление до еще одного места, чем вам нужно , а затем отрубить последнюю цифру.

>>> nout = 3  # desired number of digits in output
>>> [f'{x:.{nout+1}f}'[:-1] for x in [2/3, 4/5, 8/9, 9/8, 5/4, 3/2]]
['0.666', '0.800', '0.888', '1.125', '1.250', '1.500']

Конечно, - это округление, которое происходит здесь (а именно для четвертой цифры), но округление в некоторой точке неизбежно. Если уместен переход между усечением и округлением, вот несколько лучший пример:

>>> nacc = 6  # desired accuracy (maximum 15!)
>>> nout = 3  # desired number of digits in output
>>> [f'{x:.{nacc}f}'[:-(nacc-nout)] for x in [2.9999, 2.99999, 2.999999, 2.9999999]]
>>> ['2.999', '2.999', '2.999', '3.000']

Бонус: удаление нулей справа

>>> nout = 3  # desired number of digits in output
>>> [f'{x:.{nout+1}f}'[:-1].rstrip('0') for x in [2/3, 4/5, 8/9, 9/8, 5/4, 3/2]]
['0.666', '0.8', '0.888', '1.125', '1.25', '1.5']
0 голосов
/ 07 июня 2018

В python 3 есть простой обходной путь. Где вырезать Я определил с помощью переменной помощи decPlace, чтобы облегчить адаптацию.

f = 1.12345
decPlace= 4
f_cut = int(f * 10**decPlace) /10**decPlace

Выход:

f = 1.1234

Надеюсь, это поможет.

0 голосов
/ 30 марта 2017

>>> этаж ((1.23658945) * 10 ** 4) / 10 ** 4
1,2365

# разделить и умножить на 10 ** количество желаемых цифр

0 голосов
/ 31 августа 2015
# value  value to be truncated
# n  number of values after decimal

value = 0.999782
n = 3
float(int(value*1en))*1e-n
0 голосов
/ 24 апреля 2009

Если вы имеете в виду при печати, то должно работать следующее:

print '%.3f' % number
0 голосов
/ 20 марта 2019

Короткий и простой вариант

def truncate_float(value, digits_after_point=2):
    pow_10 = 10 ** digits_after_point
    return (float(int(value * pow_10))) / pow_10

>>> truncate_float(1.14333, 2)
>>> 1.14

>>> truncate_float(1.14777, 2)
>>> 1.14


>>> truncate_float(1.14777, 4)
>>> 1.1477
0 голосов
/ 21 апреля 2019

Большинство ответов слишком сложны, на мой взгляд, как насчет этого?

digits = 2  # Specify how many digits you want

fnum = '122.485221'
truncated_float = float(fnum[:fnum.find('.') + digits + 1])

>>> 122.48

Простое сканирование на предмет индекса '.' и обрезать по желанию (без округления). Конвертировать строку в плавающий как последний шаг.

Или, в вашем случае, если вы получаете float в качестве ввода и хотите получить строку в качестве вывода:

fnum = str(122.485221)  # convert float to string first
truncated_float = fnum[:fnum.find('.') + digits + 1]  # string output
0 голосов
/ 08 августа 2012

Я также новичок в питоне, и после того, как я использую здесь некоторые кусочки, я предлагаю свои два цента

print str(int(time.time()))+str(datetime.now().microsecond)[:3]

str (int (time.time ())) будет принимать время эпохи как int, преобразовывать его в строку и соединять с ... str (datetime.now (). microsecond) [: 3], который возвращает только микросекунды, конвертирует в строку и усекает до первых 3 символов

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...