Формат float с фиксированным количеством цифр python - PullRequest
2 голосов
/ 26 апреля 2019

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

format="%6.6g"
print(format%0.00215165)
print(format%1.23260)
print(format%145.5655)

Но это выводит

0.00215165
1.2326
145.565

Я также пытался format="%6.6f", но это не дает того, что я тоже хочу ...

0.002152
1.232600
145.565500

Что было бы хорошим способом отформатировать числа так, чтобы все они имели ровную ширину 6 (и без пробелов), как это?

0.002152
1.232600
145.5655

1 Ответ

3 голосов
/ 26 апреля 2019

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

def decimals(v):
    return max(0, min(6,6-int(math.log10(abs(v))))) if v else 6

Это просто берет журнал числа и усекает его до int.Итак, 10-99 -> 1, 100-999 -> 2 и т. Д. Затем этот результат используется для определения точности, с которой необходимо форматировать число.На практике эта функция более сложна из-за угловых случаев: что делать с отрицательными числами, числами с занижением и т. Д. Для простоты я намеренно оставил вашу цифру 6 десятичных знаков жестко 3 раза в функции.

Тогда форматирование не так сложно:

>>> v = 0.00215165
>>> "{0:.{1}f}".format(v, decimals(v))
'0.002152'
>>> v2 = 1.23260
>>> "{0:.{1}f}".format(v2, decimals(v2))
'1.232600'
>>> v3 = 145.5655
>>> "{0:.{1}f}".format(v3, decimals(v3))
'145.5655'
>>> vz = 0e0     # behaviour with zero
>>> "{0:.{1}f}".format(vz, decimals(vz))
'0.000000'
>>> vu = 1e-10   # behaviour with underflow
>>> "{0:.{1}f}".format(vu, decimals(vu))
'0.000000'
>>> vo = 1234567 # behaviour when nearly out of space  
>>> "{0:.{1}f}".format(vo, decimals(vo))
'1234567'
>>> voo = 12345678 # behaviour when all out of space
>>> "{0:.{1}f}".format(voo, decimals(voo))
'12345678'

Вы можете использовать для этого % -обозначение вместо вызова format, но это не очень очевидноили интуитивно понятный:

>>> "%.*f" % (decimals(v), v)
'0.002152'

Вы не говорите, что вы хотите сделать с отрицательными числами.Этот подход использует дополнительный символ для отображения знака минус.Если вы не хотите этого, вам нужно уменьшить количество десятичных знаков для отрицательных чисел.

...