Форматирование плавающих в Python без конечных нулей - PullRequest
148 голосов
/ 14 марта 2010

Как мне отформатировать число с плавающей точкой, чтобы оно не содержало конечных нулей?Другими словами, я хочу, чтобы полученная строка была как можно короче.

Например:

3 -> "3"
3. -> "3"
3.0 -> "3"
3.1 -> "3.1"
3.14 -> "3.14"
3.140 -> "3.14"

Ответы [ 15 ]

0 голосов
/ 20 апреля 2018

Вы можете использовать max() следующим образом:

print(max(int(x), x))

0 голосов
/ 11 декабря 2017

Вы можете достичь этого наиболее питоническим способом, например:

python3:

"{:0.0f}".format(num)
0 голосов
/ 08 марта 2017

Для float вы можете использовать это:

def format_float(num):
    return ('%i' if num == int(num) else '%s') % num

Проверьте это:

>>> format_float(1.00000)
'1'
>>> format_float(1.1234567890000000000)
'1.123456789'

Десятичное число см. Решение здесь: https://stackoverflow.com/a/42668598/5917543

0 голосов
/ 06 декабря 2016

OP хотел бы удалить лишние нули и сделать полученную строку максимально короткой.

Я считаю, что экспоненциальное форматирование% g сокращает результирующую строку для очень больших и очень малых значений. Проблема возникает для значений, которые не нуждаются в экспоненциальной записи, например 128.0, которая не является ни очень большой, ни очень маленькой.

Вот один из способов форматирования чисел в виде коротких строк, использующий экспоненциальную запись% g, только когда Decimal.normalize создает слишком длинные строки. Возможно, это не самое быстрое решение (поскольку оно использует Decimal.normalize)

def floatToString (inputValue, precision = 3):
    rc = str(Decimal(inputValue).normalize())
    if 'E' in rc or len(rc) > 5:
        rc = '{0:.{1}g}'.format(inputValue, precision)        
    return rc

inputs = [128.0, 32768.0, 65536, 65536 * 2, 31.5, 1.000, 10.0]

outputs = [floatToString(i) for i in inputs]

print(outputs)

# ['128', '32768', '65536', '1.31e+05', '31.5', '1', '10']
0 голосов
/ 24 августа 2011

Используйте% g с достаточно большой шириной, например "% .99g". Он будет печататься в формате с фиксированной запятой для любого достаточно большого числа.

РЕДАКТИРОВАТЬ: не работает

>>> '%.99g' % 0.0000001
'9.99999999999999954748111825886258685613938723690807819366455078125e-08'
...