Как я могу отформатировать число с плавающей запятой, чтобы оно не содержало конечных нулей? Другими словами, я хочу, чтобы полученная строка была максимально короткой.
Например:
3 -> "3"
3. -> "3"
3.0 -> "3"
3.1 -> "3.1"
3.14 -> "3.14"
3.140 -> "3.14"
3.14 == 3.140
- Это одно и то же число с плавающей запятой. В этом отношении 3.140000 - это то же самое число с плавающей точкой. Ноль не существует в первую очередь.%0.2f
и%0.3f
два формата, необходимые для получения последних чисел слева. Используйте%0.2f
для получения последних двух чисел справа.3.0 -> "3"
все еще действительный вариант использования.print( '{:,g}'.format( X )
работал для меня, чтобы вывести,3
гдеX = 6 / 2
и когдаX = 5 / 2
я получил вывод,2.5
как ожидалось.print("%s"%3.140)
дает вам то, что вы хотите. (Я добавил ответ внизу внизу ...)Ответы:
Я, я бы сделал
('%f' % x).rstrip('0').rstrip('.')
- гарантирует форматирование с фиксированной запятой, а не научную нотацию и т. Д. Да, не так гладко и элегантно, как%g
, но это работает (и я не знаю, как заставить%g
никогда не использовать научную нотацию; -).источник
'%.2f' % -0.0001
оставит вас с-0.00
и в конечном итоге-0
.'f' Fixed point. Displays the number as a fixed-point number. The default precision is 6.
вам придется использовать «% 0.7f» в приведенном выше решении.'%0.15f'
- плохая идея, потому что странные вещи начинают происходить.print('In the middle {} and something else'.format('{:f}'.format(a).rstrip('0')))
rstrip
команды. Просто используйте это вместо этого, чтобы убрать точку (.
) и все конечные нули впоследствии в одной операции:('%f' % x).rstrip('.0')
Вы можете использовать
%g
для достижения этого:или, для Python 2.6 или выше:
Из документов для
format
:g
причины (среди прочего)источник
'{0:...}'.format(value)
когда вы могли бы использоватьformat(value, '...')
? Это позволяет избежать необходимости разбирать спецификатор формата из строки шаблона, которая в противном случае пуста.format(v, '2.5f')
заняли ~ 10% дольше, чем'{:2.5f}'.format(v)
. Даже если это не так, я склонен использоватьstr
форму метода, потому что, когда мне нужно настроить ее, добавить к ней дополнительные значения и т. Д., Есть меньше изменений. Конечно, с 3.6 у нас есть f-строки для большинства целей. :-)f"{var:g}"
гдеvar
переменная с плавающей точкой.Как насчет того, чтобы попробовать самый простой и, вероятно, самый эффективный подход? Метод normalize () удаляет все крайние правые нули.
Работает в Python 2 и Python 3 .
- Обновлено -
Единственная проблема, как указал @ BobStein-VisiBone, состоит в том, что числа, такие как 10, 100, 1000 ... будут отображаться в экспоненциальном представлении. Это можно легко исправить с помощью следующей функции:
источник
Decimal('10.0').normalize()
становится'1E+1'
После просмотра ответов на несколько похожих вопросов, мне кажется, это лучшее решение:
Мои рассуждения:
%g
не избавляется от научной нотации.15 знаков после запятой, кажется, избегают странного поведения и обладают достаточной точностью для моих нужд.
Я мог бы использовать
format(inputValue, '.15f').
вместо'%.15f' % inputValue
, но это немного медленнее (~ 30%).Я мог бы использовать
Decimal(inputValue).normalize()
, но это также имеет несколько проблем. Во-первых, это НАМНОГО медленнее (~ 11x). Я также обнаружил, что, хотя он имеет довольно большую точность, он все еще страдает от потери точности при использованииnormalize()
.Самое главное, что я все равно буду переходить
Decimal
с а,float
что может заставить вас получить что-то, кроме числа, которое вы там указали. Я думаю, чтоDecimal
лучше всего работает, когда арифметика остаетсяDecimal
иDecimal
инициализируется строкой.Я уверен, что проблема точности
Decimal.normalize()
может быть приспособлена к тому, что необходимо, используя настройки контекста, но учитывая и без того медленную скорость и не требуя смешной точности и того факта, что я все равно буду конвертировать с плавающей запятой и теряя точность в любом случае, я не Не думаю, что это стоит того, чтобы преследовать.Меня не интересует возможный результат "-0", так как -0.0 является допустимым числом с плавающей запятой, и, возможно, это будет редким случаем в любом случае, но так как вы упомянули, что хотите сохранить строковый результат как можно более коротким, вы всегда можно использовать дополнительные условия при очень небольших дополнительных затратах на скорость.
источник
floatToString(12345.6)
возвращается'12345.600000000000364'
к примеру. Уменьшение 15%.15f
на более низкое число решает его в этом примере, но это значение нужно уменьшать все больше и больше, когда число становится больше. Это может быть динамически рассчитано на основе log-base-10 числа, но это быстро становится очень сложным.result = ('%15f' % val).rstrip('0').rstrip('.').lstrip(' ')
>>>12345.600000000000364 == 12345.6
True
Вот решение, которое сработало для меня. Это смесь из раствора путем Polymesh и использования нового
.format()
синтаксиса .Выход :
источник
3.141
), поскольку они.2f
жестко запрограммированы.Вы можете просто использовать format () для достижения этой цели:
format(3.140, '.10g')
где 10 - точность, которую вы хотите.источник
источник
int(a) if a % 1 else a
?a if a % 1 else int(a)
правильно. Вопрос нуждается в выводе в строку, поэтому я просто добавилstr
a % 1
это правда, потому что это не ноль. Я безоговорочно и ошибочно воспринимал это какa % 1 == 0
.В то время как форматирование, вероятно, является наиболее питонским способом, здесь есть альтернативное решение, использующее
more_itertools.rstrip
инструмент.Число преобразуется в строку, в которой отсутствуют завершающие символы, удовлетворяющие предикату. Определение функции
fmt
не является обязательным, но оно используется здесь для проверки утверждений, которые все проходят. Примечание: он работает со строковыми входами и принимает необязательные предикаты.Смотрите также подробности об этой сторонней библиотеке
more_itertools
.источник
Если вы можете жить с 3. и 3.0, выглядящими как «3.0», очень простой подход, который удаляет нули прямо из представлений с плавающей точкой:
(спасибо @ellimilial за указание на исключения)
источник
print("%s"%3.0)
делает.Использование пакета QuantiPhy является опцией. Обычно QuantiPhy используется при работе с числами с единицами измерения и масштабными коэффициентами СИ, но у него есть множество приятных опций форматирования чисел.
И он не будет использовать электронную запись в этой ситуации:
Альтернативой, которую вы можете предпочесть, является использование масштабных коэффициентов СИ, возможно, с единицами измерения.
источник
OP хотел бы удалить лишние нули и сделать полученную строку максимально короткой.
Я считаю, что экспоненциальное форматирование% g сокращает результирующую строку для очень больших и очень малых значений. Проблема возникает для значений, которые не нуждаются в экспоненциальной записи, например 128.0, которая не является ни очень большой, ни очень маленькой.
Вот один из способов форматирования чисел в виде коротких строк, который использует экспоненциальную запись% g, только когда Decimal.normalize создает слишком длинные строки. Возможно, это не самое быстрое решение (поскольку оно использует Decimal.normalize)
источник
Для поплавка вы можете использовать это:
Попробуй это:
Десятичное число см. Решение здесь: https://stackoverflow.com/a/42668598/5917543
источник
"{:.5g}".format(x)
Я использую это, чтобы форматировать числа с плавающей точкой, чтобы отследить нули.
источник
Вот ответ:
вывод "3.14" и "3"
trim='-'
удаляет как конечные нули, так и десятичные.источник
Используйте% g с достаточно большой шириной, например "% .99g". Он будет печатать в фиксированной записи для любого достаточно большого числа.
РЕДАКТИРОВАТЬ: это не работает
источник
.99
точность, а не ширина; вроде полезно, но вы не можете установить фактическую точность таким образом (кроме усечения ее самостоятельно).Вы можете использовать
max()
как это:print(max(int(x), x))
источник
x
отрицательный.if x < 0: print(min(x), x)
else : print(max(x), x)
Вы можете достичь этого наиболее питоническим способом, вот так:
python3:
источник
Обработка% f, и вы должны положить
где: .2f == .00 плавает.
Пример:
распечатать "Цена:% .2f"% цены [товар]
вывод:
Цена: 1.50
источник