在没有额外精度的情况下,用科学记数法打印浮动

  • 本文关键字:打印 精度 情况下 python
  • 更新时间 :
  • 英文 :


我需要一些科学表示法中的浮点字符串,如['5e-6','1e-5','1.5e-5','2e-5','2.5e-5',...]

所以我尝试用[str(n*1e-6) for n in list(range(5,60,5))]生成它们,但它给出了['4.9999999999999996e-06', '9.999999999999999e-06', '1.4999999999999999e-05',...]

然后我尝试用["{:.1e}".format(n*1e-6) for n in list(range(5,60,5))]格式化它们,它给出的['5.0e-06', '1.0e-05', '1.5e-05', '2.0e-05', '2.5e-05',...]仍然不是我想要的。

我想知道除了编写自定义函数之外,还有什么简单的方法可以做到这一点吗?谢谢

您可以用e替换.0e部分。

["{:.1e}".format(n*1e-6).replace(".0e", "e") for n in list(range(5,60,5))]

这提供

['5e-06',  '1e-05',  '1.5e-05',  '2e-05',  '2.5e-05',  '3e-05',  '3.5e-05',  '4e-05',  '4.5e-05',  '5e-05',  '5.5e-05']

这仍然留下指数中的前导零。为了消除这种情况,我们可以使用一个正则表达式:

(e-?)0(d+)

说明:https://regex101.com/r/8bXvDH/1

  • (e-?):匹配文字e,后跟可选减号。捕获组1
  • 0:匹配文字零
  • (d+):匹配一个或多个数字。捕获组2

要进行替换,我们使用re.sub():

# 12 in the replace string means capturing group 1, then capturing group 2
re.sub(r"(e-?)0(d+)", r"12", "5e-06") # Gives "5e-6"

在我们的列表中压缩:

[re.sub(r"(e-?)0(d+)", r"12", "{:.1e}".format(n*1e-6).replace(".0e", "e")) for n in list(range(5,60,5))]

提供我们想要的:

['5e-6',  '1e-5',  '1.5e-5',  '2e-5',  '2.5e-5',  '3e-5',  '3.5e-5',  '4e-5',  '4.5e-5',  '5e-5',  '5.5e-5']

这适用于您的特定示例,但请注意,它是非常硬编码的:

["{:.0e}".format(n*1e-6) if not n%10 or n<10 else "{:.1e}".format(n*1e-6) for n in list(range(5,60,5))]

在这里,您可以更改不想用任何小数部分显示的数字的格式,但仍然可以正确显示x.5数字。该代码为5做了一个例外,否则它将打印一个十进制。

这是一个完全解决您问题的版本-它还删除了指数中尾随的0:

["{:.0e}".format(n*1e-6).replace("e-0", "e-") if not n%10 or n<10 else "{:.1e}".format(n*1e-6).replace("e-0", "e-") for n in list(range(5,60,5))]

replace技巧来自这篇文章——正如文章中所说,您需要将其扩展到e+0

最新更新