2015-10-16 272 views
2

任何人都可以告诉我str(time.time())运行时发生了什么?看起来数据已被截断,但在float(str(time.time()))运行时恢复。我很困惑。Python中的str(time.time())会截断数据

In [1]: import time 

In [2]: a = time.time() 

In [3]: a 
Out[3]: 1445007755.321532 

In [4]: str(a) 
Out[4]: '1445007755.32' 

In [6]: a.__str__() 
Out[6]: '1445007755.32' 

In [7]: float(a) 
Out[7]: 1445007755.321532 
+0

检查http://stackoverflow.com/q/1317558/1860929 –

+0

str截断“。”后面的值。更具可读性。 –

回答

1

调用str(a)修改a,所以没有理由float(a)应取决于str(a)。也许你想重新分配a

a = 1445007755.321532 
a = str(a) 
float(a) 

在这种情况下,结果不同:

>>> a = 1445007755.321532 
>>> b = str(a) 
>>> a == float(b) 
False 
>>> a, b, float(b) 
(1445007755.321532, '1445007755.32', 1445007755.32) 

注意,它认为float(x) == x如果x已经是float,所以你看到的是并不奇怪的。

甚至更​​多:float(x) is x如果xfloat类型。

如果您想知道为什么str似乎截断了这个数字,这是因为它以字符串形式返回值的“人类可读”表示形式。

如果你想要一个“精确”表示使用repr,或简单地使用像一个真正的格式化功能:"%.6f" % a控制的十进制数字等

+0

谢谢,我也在这里找到一个帖子,http:// stackoverflow。com/questions/1436703/str-and-repr-in-python之间的区别,这对于这个答案将是有价值的,再次感谢。 @Bakuriu –

0

中位数的差数小数点后是str(f)repr(f)之间的差异。

默认情况下,该值被转换成字符串(之前在ipython控制台显示),使用repr()

In [1]: class C: 
    ...:  def __str__(self): 
    ...:   return 'str' 
    ...:  def __repr__(self): 
    ...:   return 'repr' 
    ...:  

In [2]: C() 
Out[2]: repr 

In [3]: str(C()) 
Out[3]: 'str' 

顺便说一句,我不能重现上的Python 3.4的输出:

In [4]: 1445007755.321532 
Out[4]: 1445007755.321532 

In [5]: str(1445007755.321532) 
Out[5]: '1445007755.321532' 

In [6]: 1445007755.321532 .__str__() 
Out[6]: '1445007755.321532' 

但我可以重现它的Python 2:

In [1]: 1445007755.321532 
Out[1]: 1445007755.321532 

In [2]: str(1445007755.321532) 
Out[2]: '1445007755.32' 

In [3]: 1445007755.321532 .__str__() 
Out[3]: '1445007755.32' 

注:float()这里不恢复精度:

In [4]: float('1445007755.32') 
Out[4]: 1445007755.32 

In [5]: float(1445007755.32) 
Out[5]: 1445007755.32 

float(a)显示在你的问题更多的数字,因为a已经是一个浮动(它可能是一个空操作操作,因为花车是不可改变的):

In [6]: a = 1445007755.321532 

In [7]: a is float(a) 
Out[7]: True 

即,在这种情况下,float(a)可能会返回完全相同的对象。