【发布时间】:2013-05-07 17:10:20
【问题描述】:
Python 的文档 (Python 2.7) 中是否定义了以下行为?
>>> '{:20}'.format(1e10)
' 10000000000.0'
>>> '{:20g}'.format(1e10)
' 1e+10'
其实第一个结果让我吃惊:documentation 表示不为浮点数指明格式类型('f'、'e'等)等价于使用通用格式'g'。这个例子说明好像不是这样的,所以我一头雾水。
也许这与“一般约定是空格式字符串 ("") 产生的结果与您在值上调用 str() 时产生的结果相同。”这一事实有关?事实上:
>>> str(1e10)
'10000000000.0'
但是,在{:20}格式的情况下,格式字符串不为空(它是20),所以我很困惑。
那么,{:20} 的这种行为是否在文档中精确定义? str() 在浮点数上的精确行为是否精确定义(str(1e11) 有一个指数,但没有 str(1e10)...)?
PS:我的目标是格式化numbers with an uncertainty,以便输出非常接近浮点数给出的结果(是否存在指数等)。但是,我很难找到确切的格式规则。
PPS:'{:20}'.format(1e10) 给出的结果不同于字符串格式 '{!s:20}'.format(1e10),其中字符串被刷新到左侧(与字符串一样)而不是右侧。
【问题讨论】:
-
你的意思是你的
20是字符串宽度,而不是浮点精度?如果你想要后者,你需要在它前面加上一个小数点:{:.20}或{:.20g}。 -
另外,您使用的是哪个版本的 Python? The docs for Python 3 对如果您不提供演示类型会发生什么有不同的解释:
Similar to 'g', except with at least one digit past the decimal point and a default precision of 12. This is intended to match str(), except you can add the other format modifiers. -
呃。是的,这一切都是定义明确的,经过深思熟虑的,而且不太可能改变。大多数这种行为也有相当完整的测试覆盖率。 OTOH,恐怕它根本没有很好的记录。因此,如果您想知道是否可以依赖这种行为,那么答案是“是”。如果您正在寻找对行为的确切描述,那么恐怕来源是您最好的选择。
-
正如@Blckknght 所说:Python 版本很重要。例如,对于 Python >= 3.2,
str和repr对于浮点数是相同的,所以str(1e11)没有指数。 -
我会考虑提交(文档)错误报告 :)
标签: python floating-point string-formatting