2011-02-14 70 views
1

我有這個函數(見下文)接受幾個值並返回一個元組。如果我使用索引打印元組的值(例如元組[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

使用%f格式規格打印將顯示7位有效數字的結果。打印元組本身不是 - 這就是爲什麼你得到-7.3 ...數字(這是非常小的,接近零)。

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