为什么打印返回的元组与索引的元组打印成员不同?

时间:2011-02-14 05:22:54

标签: python printing tuples

我有这个函数(见下文)接受一些值并返回一个元组。如果我使用索引打印元组的值(例如元组[0],元组[1]等),则打印的值是正确的。但是如果我只打印元组或打印函数,那么我会得到一些疯狂的值(有时)。

以下是代码:

import math

def getvector(x1,y1,length,angle):

    x1 = float(x1)
    y1 = float(y1)
    length = float(length)
    angle = float(angle)

    x2 = x1 + (length * math.cos(math.radians(angle)))
    y2 = y1 + (length * math.sin(math.radians(angle)))

    print "in getvector x2,y2 = (%f, %f)" % (x2,y2)

    return (x2,y2)


xy2 = getvector(0,0,4,270)
print "in main x2,y2 = (%f, %f)" % (xy2[0],xy2[1])
print getvector(0,0,4,270)
print "tuple =", xy2

结果:

in getvector x2,y2 = (-0.000000, -4.000000)
in main x2,y2 = (-0.000000, -4.000000)
in getvector x2,y2 = (-0.000000, -4.000000)
(-7.3478807948841188e-16, -4.0)
tuple = (-7.3478807948841188e-16, -4.0)

知道发生了什么事吗?当我直接打印元组时,为什么值不同?

2 个答案:

答案 0 :(得分:3)

所以这就是发生的事情:

单独打印值时,使用格式字符串(%f)打印它们,格式字符串以浮点格式打印数字(即最多约7位有效数字)。这部分是正确的。

当将值作为元组的一部分打印时,元组本身负责生成自己的字符串表示。当它创建值的字符串表示时,它不使用%f格式字符串;相反,它只是在对象上调用repr()。这导致没有格式化,只获得数字的完整14位小数的确切值。比较:

import math
>>> print "%f" % (0.0 + 4*math.cos(math.radians(270)))
-0.000000
>>> print repr(0.0 + 4*math.cos(math.radians(270)))
-7.3478807948841188e-16

答案 1 :(得分:2)

使用%f格式规范进行打印时会显示7位有效数字。单独打印元组不是 - 这就是为什么你得到-7.3 ...数字(非常小,接近于零)。