Преобразовать число с плавающей точкой в ​​строку с обрезкой нулевых десятичных знаков после точки в Python - PullRequest
9 голосов
/ 16 ноября 2009

У меня проблемы с преобразованием числа с плавающей точкой в ​​строку следующим образом:

20.02  --> 20.02
20.016 --> 20.02
20.0   --> 20

Кажется, что формат %g - лучший для этого, но я получаю странные результаты:

In [30]: "%.2g" % 20.03
Out[30]: '20'

In [31]: "%.2g" % 20.1
Out[31]: '20'

In [32]: "%.2g" % 20.3
Out[32]: '20'

In [33]: "%.2g" % 1.2
Out[33]: '1.2'

In [34]: "%.2g" % 1.0
Out[34]: '1'

In [35]: "%.2g" % 2.0
Out[35]: '2'

In [36]: "%.2g" % 2.2
Out[36]: '2.2'

In [37]: "%.2g" % 2.25
Out[37]: '2.2'

In [38]: "%.2g" % 2.26
Out[38]: '2.3'

In [39]: "%.3g" % 2.26
Out[39]: '2.26'

In [40]: "%.3g" % 2.25
Out[40]: '2.25'

In [41]: "%.3g" % 20.02
Out[41]: '20'

In [42]: "%.3g" % 20.016
Out[42]: '20'

In [43]: "%.20g" % 20.016
Out[43]: '20.015999999999998238'

Единственное решение, которое я знаю на данный момент, это проверка, является ли число int и применение %d вместо %f форматирования - я думаю, это слишком сложно.

Кто-нибудь знает, почему все вышеперечисленное происходит? Как это сделать проще?

Спасибо.

Ответы [ 6 ]

12 голосов
/ 16 ноября 2009

Использование %f спецификатора формата:

('%.2f' % (value,)).rstrip('0').rstrip('.')

Использование функции round():

str(round(value)).rstrip('0').rstrip('.')
6 голосов
/ 16 ноября 2009

Используйте округление вместе с %g - вы хотите, чтобы показывалось не более 2 цифр, поэтому округлите до двух цифр, затем используйте %g, чтобы напечатать его как можно короче:

>>> "%g" % round(20.016, 2)
'20.02'
>>> "%g" % round(20, 2)
'20'
2 голосов
/ 16 ноября 2009

Я не уверен, что именно вы находите здесь сложным - вы получаете именно те результаты, которые указаны, например. здесь . E.g.:

In [32]: "%.2g" % 20.3
Out[32]: '20'

In [33]: "%.2g" % 1.2
Out[33]: '1.2'

В каждом случае вы просили, чтобы все 2 цифры отображались, и вот что происходит (обе цифры идут перед конечной точкой в ​​одном случае, одна до и одна после в другом, но это очевидное следствие соответствующих величин чисел).

Когда вы запрашиваете 20 цифр, вам показывается 20 цифр - большинство из них, конечно, не имеют смысла (с плавающей точкой двойной точности IEEE подходит только для 16 цифр точности), поэтому более разумно спросить за меньшее. Вы, конечно, знаете, что числа с плавающей точкой представлены в двоичном виде, как объяснено здесь , верно? Используйте десятичное число (конечно, намного медленнее, поскольку то, что поставляет аппаратное обеспечение вашего компьютера - двоичная с плавающей запятой, все десятичные версии должны быть синтезированы в программном обеспечении) - это то, что вам нужно, это числа с десятичным представлением (например, вычисления).

1 голос
/ 01 июля 2017

Вы можете использовать .format вместо %.

>>> '{:.2f}'.format(3.0101)
'3.01'
>>> type('{:.2f}'.format(3.0101))
str

Существует гораздо больше вещей, которые невозможно использовать с помощью %, но можно сделать с помощью .format.

Для получения дополнительной информации о форматировании посмотрите pyformat

1 голос
/ 16 ноября 2009

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

1 голос
/ 16 ноября 2009

использовать встроенную функцию раунд

...