Форматирование с плавающей точкой Python - как "g", но с большим количеством цифр - PullRequest
7 голосов
/ 07 января 2011

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

>>> format(0.0001, "g")
'0.0001'
>>> format(0.00001, "g")
'1e-05'

Это, кажется, описано в правилах "g" (-4):

Точные правила таковы: предположим, что результат, отформатированный с типом представления 'e' и точностью p-1, будет иметь экспоненту exp. Тогда, если -4 <= exp <p, число форматируется с типом представления 'f' и точностью p-1-exp. В противном случае число форматируется с типом представления 'e' и точностью p-1. В обоих случаях незначительные завершающие нули удаляются из значимости, а десятичная точка также удаляется, если после нее нет оставшихся цифр. </p>

Есть ли способ отобразить числа, подобные "g", но с большим количеством цифр, прежде чем переключаться на научную запись?

Я думаю об использовании ".6f" и удалении конечных нулей, но тогда я не смогу увидеть маленькие числа, которые нуждаются в научной записи.

Ответы [ 3 ]

3 голосов
/ 07 января 2011

Если вы используете Python 2.7, вы можете сделать следующее, используя расширенное форматирование строк мини-язык :

>>> '{number:.{width}f}'.format(number=0.000000000001, width=20)
'0.00000000000100000000'

Затем вы можете указать необходимое значение numberи width динамически.

3 голосов
/ 17 января 2017

У меня был тот же вопрос.

Глядя на документацию Python , кажется, что g также поддерживает значения точности:

Общий формат.Для заданной точности p> = 1 это округляет число до p значащих цифр, а затем форматирует результат либо в формате с фиксированной запятой, либо в научной записи в зависимости от его величины.

Я не знаю, почему другие ответы не используют это, и я не очень опытен в Python , но это работает.

Этоможет быть просто достигнуто с помощью format(0.00001, '.10g'), где 10 - требуемая точность.

3 голосов
/ 07 января 2011
from math import log10

if log10(n) < -5:
    print "%e" % n
else:
    print "%f" % n

РЕДАКТИРОВАТЬ: также можно поместить его в одну строку:

("%e" if log10(n) < -5 else "%f") % n

Если n может быть отрицательным, используйте log10(abs(n)) вместо log10(n).

РЕДАКТИРОВАТЬ 2: Улучшено на основе комментариев Адала:

"%e" % n if n and log10(abs(n)) < -5 else ("%f" % n).rstrip("0")

Это выведет 0 как «0». Если вам нужно другое представление, например «0» или «0.0», вам нужно будет использовать специальный случай с отдельным if.

...