这很复杂,因为你想要精确(小数位数)取决于可用空间,而浮点格式化的总体目标是使有效数字取决于可用空间。要执行您想要的操作,您需要一个函数来根据数字的对数计算所需的小数位数。据我所知,没有内置函数可以为您执行此操作。
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 等等。然后你可以使用它
result 来计算出数字需要格式化的精度。在实践中
由于极端情况,函数更加复杂:如何处理负数、下溢的数字等。
为了简单起见,我特意在函数中将 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'
You can use %
- 表示法而不是调用format
但它不是很明显或直观:
>>> "%.*f" % (decimals(v), v)
'0.002152'
你不会说你想用负数做什么。这种方法的作用是采取额外的
显示减号的字符。如果你不想这样,那么你需要减少数量
负数的小数。