Python 打印浮动在科学记数法中,无需额外精度
我需要一些科学记数法中的浮点字符串,如Python 打印浮动在科学记数法中,无需额外精度,python,Python,我需要一些科学记数法中的浮点字符串,如['5e-6','1e-5','1.5e-5','2e-5','2.5e-5',…] 所以我尝试用[str(n*1e-6)为列表中的n(范围(5,60,5))]生成它们,但它给出['4.99999999999999996e-06','9.9999999999999999e-06','1.499999999999999e-05',…] 然后我尝试用[“{.1e}”.format(n*1e-6)对列表中的n(范围(5,60,5))]进行格式化,它给出了['5.0
['5e-6','1e-5','1.5e-5','2e-5','2.5e-5',…]
所以我尝试用[str(n*1e-6)为列表中的n(范围(5,60,5))]生成它们,但它给出['4.99999999999999996e-06','9.9999999999999999e-06','1.499999999999999e-05',…]
然后我尝试用[“{.1e}”.format(n*1e-6)对列表中的n(范围(5,60,5))]
进行格式化,它给出了['5.0e-06','1.0e-05','1.5e-05','2.0e-05','2.5e-05',…]这些仍然不是我想要的
我想知道除了编写自定义函数,还有什么简单的方法可以做到这一点?谢谢。这适用于您的特定示例,但请注意,它是硬编码的:
["{:.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))]
[“{.0e}”.format(n*1e-6)如果不是n%10或n您可以将.0e
部分替换为e
["{:.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+)
说明:
(e-?)
:匹配文本e
,后跟可选减号。捕获组1
0
:匹配文本零
(\d+)
:匹配一个或多个数字。捕获组2
要进行替换,我们使用re.sub()
:
在我们的列表压缩中:
[re.sub(r"(e-?)0(\d+)", r"\1\2", "{:.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']
您是否尝试过为列表(范围(5,60,5))中的n使用[“{.0e}.”格式(n*1e-6)]?我手边没有链接,但搜索浮点是否已断开?@标记在这里不太相关,因为OP可以舍入。此外,我尝试使用十进制。十进制
,但它将尾随的零计算为sig figs。但作为参考,这里有一个链接:告诉您要使用多少小数位的规则是什么?为什么输出应该包括例如,'5e-6'
而不是'5.0e-06'
,特别是考虑到'1.5e-05'
可以吗?@wjandrea舍入将不会有帮助,除非您让打印功能来完成。有些数字无法用二进制表示,而且随着数字变小,问题会变得更严重。
[re.sub(r"(e-?)0(\d+)", r"\1\2", "{:.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']