在 python 中处理大数字时获得额外数字
Getting extra numbers while handling big numbers in python
我试过了:
>>> int(5 * 1000000000000000000 * 10 ** 9 / 1000)
5000000000000000452984832
为什么我没有收到
5000000000000000000000000
如何获取真实结果?
>>> (5 * 1000000000000000000 * 10 ** 9 // 1000)
5000000000000000000000000
一旦您使用 / 而不是 //,您就在使用双精度浮点数。您将获得大约 53 位的精度,或大约 16 位的十进制精度。
无法用双精度浮点数精确表示 5000000000000000000000000。您将获得可以精确表示的最接近的整数。
我认为这个问题可能是由于使用了浮点运算 python。
来自 python 的 documentation:
On most machines today, floats are approximated using a binary fraction with the numerator using the first 53 bits starting with the most significant bit and with the denominator as a power of two.
这基本上解释了您拥有的额外数字只是机器存储浮点数的方式的结果。当你处理特别大的数字时,这个问题的解决方案可能只是注意这种影响。
这是因为在 python 除法运算符 /
中,隐式地将操作数转换为浮点数并进行除法,并且 returns 商也是浮点数,即使两个操作数都是整数。这个从除法的结果可以看出
正如你所看到的除法 returns 一个浮点数,它以一定的精度存储在机器的内存中,当将其转换为整数时,你会在商的末尾得到任意值。
您可以使用的一种补救方法是,使用底除法 //
,结果 returns 本身就是一个整数。因此,您无需将其显式转换回整数。
我试过了:
>>> int(5 * 1000000000000000000 * 10 ** 9 / 1000)
5000000000000000452984832
为什么我没有收到
5000000000000000000000000
如何获取真实结果?
>>> (5 * 1000000000000000000 * 10 ** 9 // 1000)
5000000000000000000000000
一旦您使用 / 而不是 //,您就在使用双精度浮点数。您将获得大约 53 位的精度,或大约 16 位的十进制精度。
无法用双精度浮点数精确表示 5000000000000000000000000。您将获得可以精确表示的最接近的整数。
我认为这个问题可能是由于使用了浮点运算 python。 来自 python 的 documentation:
On most machines today, floats are approximated using a binary fraction with the numerator using the first 53 bits starting with the most significant bit and with the denominator as a power of two.
这基本上解释了您拥有的额外数字只是机器存储浮点数的方式的结果。当你处理特别大的数字时,这个问题的解决方案可能只是注意这种影响。
这是因为在 python 除法运算符 /
中,隐式地将操作数转换为浮点数并进行除法,并且 returns 商也是浮点数,即使两个操作数都是整数。这个从除法的结果可以看出
正如你所看到的除法 returns 一个浮点数,它以一定的精度存储在机器的内存中,当将其转换为整数时,你会在商的末尾得到任意值。
您可以使用的一种补救方法是,使用底除法 //
,结果 returns 本身就是一个整数。因此,您无需将其显式转换回整数。