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 (如果有的话)
答
浮点数只是分母的2次幂的一组分数。2^- n有n小数点后的数字,所以一个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位都是整数,因此整数也是一个整数。
第十位以相对精度丢失 – percusse