在使用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?
提前感谢您的解释:)
答案 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