Python浮点格式-类似于;g";,但是有更多的数字

Python浮点格式-类似于;g";,但是有更多的数字,python,formatting,floating-point,Python,Formatting,Floating Point,我使用“g”对浮点值进行格式化,但对我来说,转换为科学格式太快了-在第5位: >>> format(0.0001, "g") '0.0001' >>> format(0.00001, "g") '1e-05' 这似乎在“g”规则(即-4)中有描述: 精确的规则如下:假设使用表示类型“e”和精度p-1格式化的结果将具有指数exp。如果-4 这会将0打印为“0”-如果您想要另一个表示形式,如“0”或“0.0”,则需要使用单独的if对其进行特殊处理。如果您使用的是

我使用
“g”
对浮点值进行格式化,但对我来说,转换为科学格式太快了-在第5位:

>>> format(0.0001, "g")
'0.0001'
>>> format(0.00001, "g")
'1e-05'
这似乎在
“g”
规则(即-4)中有描述:

精确的规则如下:假设使用表示类型“e”和精度p-1格式化的结果将具有指数exp。如果-4
这会将0打印为“0”-如果您想要另一个表示形式,如“0”或“0.0”,则需要使用单独的
if

对其进行特殊处理。如果您使用的是Python 2.7,则可以使用它的高级字符串格式执行以下操作:


然后,您可以动态指定所需的
number
width
值。

我也有同样的问题

查看Python文档,似乎g也支持精度值:

一般格式。对于给定的精度p>=1,这将对 将数字设置为p有效数字,然后将结果格式化为 固定点格式或科学符号,取决于其 规模

我不知道,为什么其他答案不使用这个,而且我在Python方面不是很有经验,但它可以工作


这可以简单地通过使用
格式(0.00001,.10g')
来实现,其中10是您想要的精度。

+1-或者,作为一行:
(“%f',“%e”)[log10(n)<-5])%n
-但是,解决方案只适用于正
n
。@eumiro:负数的观点很好(更新了答案),但我真的不喜欢你的一句台词。通过布尔值对元组进行索引只是…非pythonic..rstrip(“0”)应该添加到“%f”输出中,以便结果更像“%g”。还需要检查n==0(未为0定义日志)。我仍然希望对小数字(如1e-25)保留指数表示法,而不是显示0.0000000000。感谢您指出这一点。我发现一些比较晦涩的字符串格式记录得很差,或者很难找到。这对我使用pandas创建csv的地方很有用:
dataframe.to_csv(float_format=“%.12g”)
我很难理解g是如何精确工作的:f“{10.554545:2g}”>'10.5545'f{10.554545:2g}->'11'f{10.554500:2g}”>'10.5545'f{10.554500:3g}->“10.5545”,所以它似乎不是很精确。看起来你忘记在冒号后面加一个点了,有几个例子吗?还是仅仅为了测试目的?我认为这一点是必要的,当它出现时,它会做预期的事情:它将
10.554545
变成
11
(两个有效数字)
f“{10.554545:.4g}”
可能会导致
10.55
。不过,我还没有尝试过,这只是我的假设。根据下面的评论,
“.6g”
是有效的格式字符串
from math import log10

if log10(n) < -5:
    print "%e" % n
else:
    print "%f" % n
("%e" if log10(n) < -5 else "%f") % n
"%e" % n if n and log10(abs(n)) < -5 else ("%f" % n).rstrip("0")
>>> '{number:.{width}f}'.format(number=0.000000000001, width=20)
'0.00000000000100000000'