防止f字符串将浮点数转换为科学计数法

10

我被Python 3.7.2中f-strings的默认行为所吸引:

>> number = 0.0000001
>> string = f"Number: {number}"
>> print(string)
Number: 1e-07

我期望的是:数字:0.0000001

这个问题非常恼人,特别是在创建文件名时。我该如何禁用这种自动转换为科学计数法?而且为什么它首先启用了呢?

基本上与此问题相反。

编辑:我想避免通过{number:.8f}设置浮点数的固定长度,因为我的数字长度不同,我不想有任何尾随零。我希望使用f-strings自动制作文件名,就像这样:

filename = f"number_{number:.10f}_other_number_{other_number:.10f}.json"

我正在寻找一个简单的修改器,可以禁用自动科学计数法,同时保持浮点数的原始精度。


1
你需要定义“原始精度”。因为0.0000001不会得到0.0000001,而是得到0.0000000999999999999999954748111825886258685613938723690807819366455078125。 - Kelly Bundy
确实如此。但是为什么对于 number = 0.01 起作用呢?是因为 0.01 仍然在浮点数的标准精度范围内吗?我该如何让 f-string 理解更高精度的浮点数? - mrzo
我不知道原因,但它比f-strings更通用,str(0.00001)repr(0.00001)也都会得到'1e-05'。还有一个旧问题,似乎没有人给出一个好的答案。 - Kelly Bundy
1
哦,我没有找到那个问题。https://dev59.com/MXRB5IYBdhLWcg3wUV1d#58106536建议使用numpy.format_float_positional,这对我很有效。 - mrzo
哦,不知怎么的我忽视了那个。它很好。 - Kelly Bundy
2个回答

9

谢谢您的回答。对不起,我没有表述清楚。我想避免尾随零并添加固定精度,因为我的数字长度不同。我修改了我的问题。 - mrzo
2
选择一个大数并在 str 实例上添加 .rstrip('0')。如果你的数字恰好是 "3.00000",则添加 .rstrip('0').rstrip('.'),以便你的字符串不会变成 "3." - Tin Nguyen
使用 None 时,您将获得 1e-07。这就是为什么我们在此处使用 f 的原因。 - Tin Nguyen
非常抱歉,我应该在我的回答中提供更多的上下文。我的问题是,我想使用f-string作为方便的方式来创建文件名。使用rstrip的方法在这样的f-string中不太适用:f"number_{number:.10f}_other_number_{other_number:.10f}"。可能我需要使用replace或regex来解决。 - mrzo
显示剩余2条评论

1

在检查了其他来源后,我发现numpy.format_float_positional 在这里非常好用:

import numpy as np
number = 0.0000001
string = f"Number: {np.format_float_positional(number)}"

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