Python浮点数格式化 - 类似"g",但更多数字

12 投票
4 回答
16050 浏览
提问于 2025-04-16 09:34

我在格式化浮点数时使用 "g",但是它切换到科学计数法的时机对我来说太早了——在第五位数字的时候就切换了:

>>> format(0.0001, "g")
'0.0001'
>>> format(0.00001, "g")
'1e-05'

这似乎在 "g" 的规则中有说明(-4的部分):

具体规则如下:假设用 'e' 类型格式化的结果,精度是 p-1,会有一个指数 exp。那么如果 -4 <= exp < p,这个数字会用 'f' 类型格式化,精度是 p-1-exp。否则,这个数字会用 'e' 类型格式化,精度是 p-1。在这两种情况下,末尾不重要的零会被去掉,如果小数点后没有剩余的数字,小数点也会被去掉。

有没有办法像 "g" 一样显示数字,但在切换到科学计数法之前能显示更多的数字呢?

我在考虑使用 ".6f" 并去掉末尾的零,但这样我就看不到小数字了,而小数字需要用科学计数法来表示。

4 个回答

3

如果你在使用 Python 2.7,可以通过它的高级字符串格式化功能来做到这一点,具体可以参考这个小语言

>>> '{number:.{width}f}'.format(number=0.000000000001, width=20)
'0.00000000000100000000'

这样你就可以动态地指定 numberwidth 的值了。

10

我也有过同样的疑问。

看了下 Python 的文档,发现 g 这个格式也支持精度值:

通用格式。对于给定的精度 p >= 1,它会把数字四舍五入到 p 位有效数字,然后根据数字的大小,选择用固定小数点格式或者科学计数法来显示结果。

我不知道为什么其他的回答没有提到这个,我对 Python 也不是很熟悉,但这个方法确实有效。

你可以简单地用 format(0.00001, '.10g') 来实现,其中 10 就是你想要的精度。

4
from math import log10

if log10(n) < -5:
    print "%e" % n
else:
    print "%f" % n

编辑:也可以把它写成一行:

("%e" if log10(n) < -5 else "%f") % n

如果 n 可能是负数,那么就用 log10(abs(n)) 来代替 log10(n)

编辑 2:根据 Adal 的评论进行了改进:

"%e" % n if n and log10(abs(n)) < -5 else ("%f" % n).rstrip("0")

这样会把 0 打印成 "0."——如果你想要其他的表示方式,比如 "0" 或 "0.0",你需要用一个单独的 if 来处理这个情况。

撰写回答