Python浮点精度,小数点后没有整数精度

时间:2016-04-13 12:26:01

标签: python floating-point

在使用float精度时,我偶然发现了一个奇怪的事实。为什么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?

提前感谢您的解释:)

3 个答案:

答案 0 :(得分:4)

就是那样ever since % formatting was added back in 1993;如果.后面没有小数后加precision is taken as zero

这是未记录的,但与printf一致,Python %格式的灵感来自:

  

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

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

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

答案 1 :(得分:1)

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

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

对于不同的口译员,这甚至可能表现不同。无论如何有趣的发现:)。

有趣的是,使用str.format会在我的2.7解释器中抛出一个很好的ValueError:

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

答案 2 :(得分:1)

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

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

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

一个有趣的说明是helper function formatfloat在这种情况下实际上str.format(),可能是为了更容易实现,而不是让人们依赖于未指明的行为:

>>> "{:.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