python 使用固定数量的数字格式化浮点数

Jan*_*aet 3 python string-formatting

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

format="%6.6g"
print(format%0.00215165)
print(format%1.23260)
print(format%145.5655)
Run Code Online (Sandbox Code Playgroud)

但这输出

0.00215165
1.2326
145.565
Run Code Online (Sandbox Code Playgroud)

我也尝试过format="%6.6f",但它也没有真正给出我想要的......

0.002152
1.232600
145.565500
Run Code Online (Sandbox Code Playgroud)

什么是格式化数字的好方法,以便所有数字都具有精确的宽度 6(并且没有空格),就像这样?

0.002152
1.232600
145.5655
Run Code Online (Sandbox Code Playgroud)

Boa*_*les 5

这很复杂,因为您希望精度(小数位数)取决于可用空间,而浮点格式化的总体目标是使有效位数取决于可用空间。要执行您想要的操作,您需要一个函数来根据数字的对数计算所需的小数位数。据我所知,没有内置函数可以为您执行此操作。

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

这只是获取数字的日志并将其截断为 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'
Run Code Online (Sandbox Code Playgroud)

可以使用%-notation 来代替调用format,但它不是很明显或直观:

>>> "%.*f" % (decimals(v), v)
'0.002152'
Run Code Online (Sandbox Code Playgroud)

你不会说你想用负数做什么。这种方法的作用是使用一个额外的字符来显示减号。如果您不希望这样,那么您需要减少负数的小数位数。