为什么要打印();切割“;python中的浮点变量?

为什么要打印();切割“;python中的浮点变量?,python,Python,如果我打印一个列表中包含的一个浮点数列表,没有问题,但是如果我只打印这个列表中的一个浮点数,它不会打印所有的数字 listafeaturevector = [ [0.26912666717306399, 0.012738398606387012, 0.011347858467581035, 0.1896938013442868, 2.444553429782046] , [0.36793086934925351, 0.034364344308391102, 0.0190545367915510

如果我打印一个列表中包含的一个浮点数列表,没有问题,但是如果我只打印这个列表中的一个浮点数,它不会打印所有的数字

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]) 

这是因为,
浮点数
通过调用
\uuu str\uu
方法转换为字符串。这将截断数字。 如果您不想要精确的表示,您应该通过内置的
repr
调用
repr\uuu
方法来获得整个浮点表示

这里的另一个重要因素是,浮点的精度高于IEEE 64位可表示格式。所以会有一些截断

范例

>>> print 0.26912666717306399
0.269126667173
>>> print repr(0.26912666717306399)
0.269126667173064
>>> print("%.16f" % 0.26912666717306399)
0.2691266671730640
>>> 

您可以指定小数点后所需的位数:

print("%.15f" % a[j])

尝试使用字符串格式:

print(".%15f" % a[0])

原因是,当您打印
列表时,它调用列表的
\uuuu str\uuuuu
方法,而该方法又调用其每个项的
\uuuu repr\uuuu
方法。引用

对象。报告(自我) 由repr()内置函数和字符串转换(反引号)调用,以计算对象的“正式”字符串表示形式。如果可能的话,这应该看起来像一个有效的Python表达式,可以用来重新创建具有相同值的对象(给定适当的环境)

因此
\uuuu repr\uuuu
应尽量靠近对象。因此:

>>> 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]

请注意,
float
无论如何都不能保持这些精确值;您可能需要
decimal.decimal