我有这个函数(见下文)接受一些值并返回一个元组。如果我使用索引打印元组的值(例如元组[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)
知道发生了什么事吗?当我直接打印元组时,为什么值不同?
答案 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 ...数字(非常小,接近于零)。