为什么在Python中print()会"截断"浮点变量?
如果我打印一个包含浮点数的列表,没问题。但是如果我只打印这个列表中的一个浮点数,它就不会显示所有的数字!
listafeaturevector = [
[0.26912666717306399, 0.012738398606387012, 0.011347858467581035, 0.1896938013442868, 2.444553429782046]
,
[0.36793086934925351, 0.034364344308391102, 0.019054536791551006, 0.0076875387476751395, 3.03091214703604]
,
[0.36793086934925351, 0.034364344308391102, 0.019054536791551006, 0.0076875387476751395, 3.03091214703604]
,
[0.30406240228443038, 0.047100329090555518, 0.0049653458889261448, 0.0004618404341300081, 5.987025009738751]
]
for i in range (0,len(listafeaturevector)):
a = listafeaturevector[i]
print(a[0])
print(",")
print(a)
for j in range (0, len(a) ):
print(a[j])
这个可以打印出所有的数字:
print(a)
这个只打印出部分数字:
print(a[0])
4 个回答
1
之所以会这样,是因为当你用 print
打印一个 list
时,它会调用这个列表的 __str__
方法,而这个方法又会调用列表中每个项目的 __repr__
方法。引用一下文档:
object.__repr__(self) 这个方法是由内置的 repr() 函数和字符串转换(反引号)调用的,用来计算一个对象的“官方”字符串表示。如果可能的话,这个表示应该看起来像一个有效的 Python 表达式,可以用来在合适的环境中重新创建一个具有相同值的对象。
所以 __repr__
方法应该尽量接近对象本身。因此:
>>> repr(0.012738398606387012)
'0.012738398606387012'
>>> str(0.012738398606387012)
'0.0127383986064'
作为一个模范公民,list
尽量让它的所有项目看起来都有意义。这就是为什么你的数字不会被截断的原因。
使用这个简单的测试类,我们可以观察到相同的行为:
class B():
def __str__(self): return 'STR CALLED'
def __repr__(self): return 'REPR CALLED'
>>> print(B())
STR CALLED
>>> print([B()])
[REPR CALLED]
2
你可以指定小数点后想要的位数:
print("%.15f" % a[j])
4
这是因为,floats
(浮点数)在转换成字符串时,会调用 __str__
方法。这会导致数字被截断。如果你想要精确的表示,应该通过 repr
这个内置函数来调用 __repr__
方法,这样可以得到完整的浮点数表示。
另一个重要的因素是,你的浮点数的精度高于 IEEE 64 位可表示的格式。所以会有一些截断的情况。
例子
>>> print 0.26912666717306399
0.269126667173
>>> print repr(0.26912666717306399)
0.269126667173064
>>> print("%.16f" % 0.26912666717306399)
0.2691266671730640
>>>