【问题标题】:Python float precision with no integer precision after decimal pointPython浮点精度,小数点后没有整数精度
【发布时间】:2016-04-13 23:56:19
【问题描述】:

在使用浮点精度时,我偶然发现了一个奇怪的事实。为什么 python 在使用"%.f" 格式化时只打印整数部分。我愿意知道这背后的机制

 >>> a = float(2.12345)
 >>> a
 2.12345
 >>> print "%.2f" % a
 2.12
 >>> print "%.1f" % a
 2.1
 >>> print "%f" % a
 2.123450
 >>> print "%.f" % a
 2                   #why?

提前感谢您的解释:)

【问题讨论】:

标签: python floating-point


【解决方案1】:

原来是这样ever since % formatting was added back in 1993;如果. 后面没有十进制数字,则precision is taken as zero

这是无证的,但与printf 一致,Python 的% 格式的灵感来自:

(可选). 后跟整数或*,或者两者都不指定转换的精度。在使用 * 的情况下,精度由 int 类型的附加参数指定。如果此参数的值为负,则将其忽略。如果既没有使用数字也没有使用*,则精度为零。

有趣的是,另一个受printf 启发的未记录功能是您可以使用* 作为精度,如上:

>>> "%6.*f" % (2, 1.234)
'  1.23'

【讨论】:

  • 你的回答对我来说似乎是合乎逻辑的。但我想知道为什么字符串格式会引发 srowland 在他的回答中提到的值错误?
  • @HiteshPaul string.format 是后来的 API(在 PEP 3101 中引入),因此可以使其严格符合规范;在不破坏向后兼容性的情况下,无法删除 % 的未记录行为。
  • @HiteshPaul 在下面查看我的答案:)
【解决方案2】:

如果精度被省略,精度 here 的文档不会提及默认值。我只能假设它只是这样工作,因为它确实如此!

文档在格式规范迷你语言 here 中将 %f 的默认精度设为 6。也许通过使用 .然后通过省略一个整数值,解释器假设它应该为零?

这甚至可能在不同的解释器上表现不同。还是很有趣的发现:)。

有趣的是,在我的 2.7 解释器中使用 str.format 会引发一个不错的 ValueError:

>>> f = 234.12345676
>>> "{:.f}".format(f)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: Format specifier missing precision

【讨论】:

  • 看起来很奇怪,python 为字符串格式引发 ValueError 而为 '%' 格式引发 none。
  • 完全同意你的看法:)。我猜格式在这一点上有更严格的实现。
  • 这是否意味着字符串格式和 % 格式的内部实现不同?
  • 我认为这两个结果都不是更“严谨”。正如我在对该问题的评论中所说,这是未定义的行为。您可能会得到默认的零小数点,您可能会遇到异常,Python 解释器可能会崩溃,或者您的机器可能会重新启动。有些选项似乎更好,但都是有效的。
  • 感谢@Chris - 链接已修复。我同意这只是未定义的。 format 在我的解释器中给出ValueError"%.f" 没有。
【解决方案3】:

% 运算符具有以下行为,就像您观察到的那样:

>>> "%.f" % 1.23
'1'

解析器遍历格式字符串,精度为undefined (-1) by default。当它达到. 时,精度为will be set to 0。如果没有给出精度,参数将被传递给helper function formatfloat,它使用默认精度6,并且没有使用.

一个有趣的说明是,str.format() 在这种情况下实际上是throw an exception,可能是为了更容易实现并且不让人们依赖未指定的行为:

>>> "{:.f}".format(1.23)
Traceback (most recent call last):
  File "<ipython-input-6-677ba2e4a680>", line 1, in <module>
    "{:.f}".format(1.23)
ValueError: Format specifier missing precision

【讨论】:

    猜你喜欢
    • 2013-01-10
    • 2010-12-26
    • 2018-02-23
    • 2020-02-03
    • 1970-01-01
    • 1970-01-01
    • 2011-05-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多