格式化带有固定位数的浮点数 python

Format float with fixed amount of digits python

我想用固定数量的数字格式化我的浮点数。现在我正在做以下事情

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

这很复杂,因为您希望 精度(小数位数)取决于可用的 space,而浮点格式的一般推力是使有效数字的数量取决于可用的space。要做你想做的事,你需要一个函数,从数字的日志中计算所需的小数位数。据我所知,没有内置函数可以为您执行此操作。

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

这只是获取 number 的日志并将其截断为 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'

可以为此使用%-notation而不是调用format,但这不是很明显或直观:

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

你不会说你想用负数做什么。这种方法的作用是采取额外的 显示减号的字符。如果你不想那样,那么你需要减少的数量 负数的小数。