【问题标题】:Precise definition of float string formatting?浮点字符串格式的精确定义?
【发布时间】: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,strrepr 对于浮点数是相同的,所以 str(1e11) 没有指数。
  • 我会考虑提交(文档)错误报告 :)

标签: python floating-point string-formatting


【解决方案1】:

正如@blckknght 在 cmets 中解释的那样,'{:20}' 指定字符串宽度为 20;要指定浮点精度,您需要在它前面加上一个小数点:{:.20}{:.20g}

至于为什么要按原样格式化数字,OP 表示:“一般约定是空格式字符串 ("") 产生的结果与您在值上调用 str() 时产生的结果相同。”这就是你得到的,按照格式字符串用空格填充(数字格式为空,格式可以容纳完整的str 表示)。

【讨论】:

  • 问题的思路不是指定浮点precision,而是指定浮点表示的width。所以.20 格式在这里不相关。真正的问题是文档中的哪个位置(如果有的话)是描述的“无演示类型”表单{:20} 的行为。我的理解是文档说它应该是g,用于浮点数,但问题中的代码显示改为使用字符串形式,这很奇怪。
  • @EOL 在这种情况下,答案在问题中:“一般约定是空格式字符串 ("") 产生的结果与您在值上调用 str() 时产生的结果相同。”
  • 问题恰恰是格式字符串:20实际上是not为空的...... presentation type虽然是空的,但是随后的文档float 格式表示该类型应该像g,事实并非如此。
  • @EOL 数字的格式是空的,它指定的格式可以容纳完整的str 表示。
  • @EOL 你看到了一个没有谜团的地方:默认是你从str 得到的。如果它有任何不同,那将是令人惊讶的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多