繁体   English   中英

使用固定位数的python格式化float

[英]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

这很复杂,因为您希望精度 (小数位数)取决于可用空间,而浮点格式的一般推力是使有效数字位数取决于可用空间。 要执行您想要的操作,您需要一个函数,该函数从数字的对数中计算出所需的小数位数。 据我所知,没有一个内置函数可以为您完成此任务。

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'

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

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

您不会说要用负数做什么。 这种方法的作用是增加一个字符以显示减号。 如果您不希望这样做,则需要减少负数的小数位数。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM