Это сложно, потому что вы хотите, чтобы точность (количество десятичных знаков) зависела от доступного пространства, в то время как общая задача форматирования с плавающей запятой состоит в том, чтобы сделать число значащих цифр зависит от доступного места.Чтобы сделать то, что вы хотите, вам нужна функция, которая вычисляет желаемое количество десятичных знаков из журнала числа.Насколько я знаю, нет встроенной функции, которая сделает это за вас.
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'
Вы не говорите, что вы хотите сделать с отрицательными числами.Этот подход использует дополнительный символ для отображения знака минус.Если вы не хотите этого, вам нужно уменьшить количество десятичных знаков для отрицательных чисел.