python - 为什么long和float的乘法会产生小数类似的答案?

问题描述:

在这个例子中:python - 为什么long和float的乘法会产生小数类似的答案?

long_ten = 10**21 
print(' type(long_ten):', type(long_ten)) 
print('  long_ten: {:52,f}'.format(long_ten)) 
tenth = 0.1 
print(' type(tenth):', type(tenth)) 
print(' float(52f): {:52.52f}'.format(tenth)) 
float_res = tenth * long_ten 
print('\n type(float_res):', type(float_res)) 
print(' float(52f): {:15.52f}'.format(float_res)) 

为什么在小数般的精度浮点数长和float结果乘以?

type(long_ten): <type 'long'> 
long_ten:     1,000,000,000,000,000,000,000.000000 
type(tenth): <type 'float'> 
float(52f): 0.1000000000000000055511151231257827021181583404541016 

type(float_res): <type 'float'> 
float(52f): 100000000000000000000.0000000000000000000000000000000000000000000000000000 

我希望的结果是:

100000000000000005551.1151231257827021181583404541016... 

我明白为什么结果类型为浮动 - B/C,它比长

注更宽 - 这是使用Python 2 (如果有的话)

+0

第十位以相对精度丢失 – percusse

浮点数只是分母的2次幂的一组分数。2^- nn小数点后的数字,所以一个float可以很容易地有53个非零数字(对于大数字更多,因为没有2的幂是10的幂)。你只是打印(几乎)那个“完整”的数字;我们通常不会那样做,因为除了前16个(或其他)之外,其他所有的只是前几个确定的“噪音”。

100000000000000000000可表示为浮动:

>>> n = 100000000000000000000 
>>> int(float(n)) 
100000000000000000000L 

下一个较大的浮动是100000000000000016384:

>>> from itertools import count 
>>> next(int(float(i)) for i in count(n) if int(float(i)) != n) 
100000000000000016384L 

因此浮最接近您的预期100000000000000005551.115 ......是100000000000000000000,所以这是你得到了什么。

为什么漂浮这个大总是整数?那么,你可以在二元看到它已经是67位:

>>> bin(n) 
'0b1010110101111000111010111100010110101100011000100000000000000000000' 
>>> len(bin(n)[2:]) 
67 

floats only store the most significant 53 bits。因此,由于前面的位值2 ,所以尾部位已经相当于2 66-52 = 16384.正如我们已经在上面看到的那样。所以所有的53位都是整数,因此整数也是一个整数。