将科学计数法转换为无尾零的十进制数

3

我希望打印出浮点数

  • 使用十进制表示
  • 无多余的零

例如:

1e-5    -> 0.00001
1.23e-4 -> 0.000123
1e-8    -> 0.00000001

以下是一些不起作用的方法:

str(x) 输出小浮点数的科学计数法

format(x, 'f')"{:f}".format(x) 有固定数量的小数位,因此会保留尾随零。

('%f' % x).rstrip('0').rstrip('.') 会将1e-8四舍五入到0

from decimal import Decimal
(Decimal('0.00000001000').normalize())

使用科学计数法

%0.10f 要求我提前知道浮点数的精度。


5
可能是 Formatting floats in Python without superfluous zeros 的重复问题。 - FlyingTeller
1
那个问题的答案并不能解决我的问题。我在这方面编辑了我的问题。 - usernumber
1
嗯,你的数字可以变得非常小,但是理论上有一个极限。不过我相信在实际应用中,你可能会期望输出的数字有一个可接受的最小值限制。 - FlyingTeller
1
一个IEEE double类型大约有log10(2^53)=15.95个十进制数字的精度。因此只需使用%.15f即可。 - eugenhu
@BennettBrown 那会是什么样子? - usernumber
显示剩余3条评论
2个回答

1
在 eugenhu 的评论基础上,使用 15 位精度的 rstrip('0') 看起来能够适用于你所有的示例。
("%0.15f" % 1.e-5).rstrip('0')
Out[17]: '0.00001'

("%0.15f" % 1.e-8).rstrip('0')
Out[18]: '0.00000001'

("%0.15f" % 1.23e-4).rstrip('0')
Out[19]: '0.000123'

1
如果您的数字一直是这样的,您可以修改字符串:
number = "1.23155e-8" # as a string
lead, power = number.split("e-")
a, b = lead.split(".")
number = "0." + "0"*(int(power)-1) + a + b

print(number)

编辑:已修复。

当我的浮点数足够小,以至于我知道str(number)将以“1.2345e-6”的格式进行格式化时,这很有效。但是如果我有f=1e-1,那么我需要额外的步骤来转换为科学计数法。 - usernumber

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接