python - 为什么long和float的乘法产生十进制的答案?

时间:2017-10-07 00:27:01

标签: python precision python-2.x

在这个例子中:

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))

为什么将long和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...

我理解为什么结果类型是float - b / c它比long长

注意 - 这是使用python 2(如果重要)

2 个答案:

答案 0 :(得分:2)

100000000000000000000可表示为float:

>>> 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 66 ,尾部位已经值2 66-52 = 16384.正如我们已经在上面看到的那样。所以所有53位都是值整数,因此整数也是一个整数。

答案 1 :(得分:0)

浮点数只是一组特定的分数,其分母是2的幂.2 ^ - n 在小数点后有 n 位数,所以a {{ 1}}可以轻松拥有53个非零数字(大数字更多,因为2的幂不是10的幂)。你只是打印(差不多)那个“满”的号码;我们通常不这样做,因为除了前16个(或左右)之外的所有只是前几个确定的“噪音”。