【问题标题】:Why print() "cutting" float variables in python? [duplicate]为什么 print() 在 python 中“切割”浮点变量? [复制]
【发布时间】:2013-02-26 16:16:16
【问题描述】:

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

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

【问题讨论】:

标签: python


【解决方案1】:

这是因为,floats 通过调用__str__ 方法转换为字符串。这将截断数字。 如果你不想要确切的表示,你应该通过 repr 内置调用 __repr__ 方法来获得整个浮点表示

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

例子

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      原因是当你printlist 时,它会调用列表的__str__ 方法,而列表又会调用每个项目的__repr__ 方法。引用docs

      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]
      

      【讨论】:

        【解决方案4】:

        尝试使用字符串格式:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-10-06
          • 2015-12-26
          • 2018-04-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多