您正在使用真正的除法运算符/进行除法,这将始终产生浮点值.改为使用floor division来获取整数结果:
>>> a = 313585730727764141482831584863
>>> b = a*2
>>> c = b // 2
>>> a == c
True
您的计算机硬件无法以所需的精度处理浮点值.
另一种方法是使用decimal.Decimal() values,但这会导致算术运算速度变慢.
在Python 2中,/运算符是分区运算符,但仅适用于整数.要在Python 2中获得相同的行为,请添加:
from __future__ import division
行为发生了变化,因为仅使用整数运算符和使用至少一个float参数之间的区别令人困惑.
换句话说,标准的Python 2 /运算符与Python 3 / division运算符不同.当应用于两个整数操作数时,它就像Python 3中的// floor division运算符一样.但是如果两个操作数中的任何一个都是float,那么它就像/ float除法运算符一样.上面的__future__ import为Python 3中的真正除法运算符交换了Python 2 /运算符.
你可以在反汇编Python字节码时看到这个:
>>> import dis
>>> def olddivision(x, y): return x / y
...
>>> dis.dis(olddivision)
1 0 LOAD_FAST 0 (x)
3 LOAD_FAST 1 (y)
6 BINARY_DIVI