我想用固定的位数格式化我的浮点数。现在我正在做以下事情
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
答案 0 :(得分:3)
这很复杂,因为您希望 precision (小数位数)取决于可用空间,而浮点格式的一般推力是使有效数字位数取决于可用空间。要执行您想要的操作,您需要一个函数,该函数根据数字的对数计算所需的小数位数。据我所知,没有一个内置函数可以为您完成这项工作。
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'
您不会说负数要做什么。这种方法要做的是额外花费 显示减号的字符。如果您不希望这样做,则需要减少 小数表示负数。