首页 > 解决方案 > 将浮点格式化为固定宽度的python

问题描述

我不关心小数点的位置,并且希望在适当的时候以科学计数法打印以最大精度显示。但是,我想适当地四舍五入以保持固定的宽度,不规则的左边或不规则的右边都可以。

例如

>>> my_format("{:10f}", 0.0000000456)
"  4.56e-08"
>>> my_format("{:10f}", 12.345678987654321)
" 12.345679"
#or "12.34567890" because significant digits
#but not "1.2346e+01", since it is less accurate than the above representations
>>> my_format("{:10f}", 12345678987654321)
"1.2345e+16"

编辑以澄清示例,width格式说明符不提供固定宽度。它提供了最小宽度。如何获得固定宽度的表示?

标签: pythonformatting

解决方案


如果你想要科学记数法,g格式说明符通常很好,即:

my_format = "{:.10g}".format

应该做正确的事:

>>> list(my_format(v) for v in (0.0000000456, 12.345678987654321, 12345678987654321))
['4.56e-08', '12.34567899', '1.234567899e+16']

后来我意识到上面的功能没有做OP想要的

根据@a_guest 的有用评论,我提出了以下建议:

def my_format(v, length=10):
    n = length
    while n > 0:
        i = len('%#.*g' % (n, v))
        s = '%.*g' % (n + n - i, v)
        if len(s) <= length:
            return s
        n -= 1
    return s

我现在['4.56e-08', '12.345679', '1.2346e+16']回来了,它更接近想要的东西。

我已经通过使用以下方法生成大量随机数来对此进行测试:

from random import uniform
def rnd_float():
    return uniform(-10, 10) * 10 ** (uniform(-1.6, 1.6) ** 11)

相当随意,但生成的数字相当接近我关心的分布。即大多在 1 左右,但有一些非常小和大,概率还不错。

我已经将数字从这里传递到my_format100k 次,并且我得到了适当格式的数字。


推荐阅读