Python浮点数格式化 - 类似"g",但更多数字
我在格式化浮点数时使用 "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 个回答
如果你在使用 Python 2.7,可以通过它的高级字符串格式化功能来做到这一点,具体可以参考这个小语言:
>>> '{number:.{width}f}'.format(number=0.000000000001, width=20)
'0.00000000000100000000'
这样你就可以动态地指定 number
和 width
的值了。
我也有过同样的疑问。
看了下 Python 的文档,发现 g 这个格式也支持精度值:
通用格式。对于给定的精度 p >= 1,它会把数字四舍五入到 p 位有效数字,然后根据数字的大小,选择用固定小数点格式或者科学计数法来显示结果。
我不知道为什么其他的回答没有提到这个,我对 Python 也不是很熟悉,但这个方法确实有效。
你可以简单地用 format(0.00001, '.10g')
来实现,其中 10 就是你想要的精度。
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
来处理这个情况。