为了建立上下文,我只讨论整数算术,在大整数上,所以通过浮点不是一种选择,并且使用负数,所以地板和截断除法之间的区别很重要。
在对负整数执行除法时,典型的硬件和 C 系列编程语言会给出截断的结果,例如 1 / -2 = 0。Python 2 给出下限的结果,例如 1 / -2 = -1。
尽管关于哪个本质上更好的争论,有没有办法让 Python 给出截断的结果?如果您使用 Python 3 而不是 2,会有什么不同吗?
好的,如果您只是想要一个解决方案,请记住int
截断数字,因此不要进行整数除法,而是截断浮点数int
int(1./-2)
如果你使用的是 Python 3.X,你可以简单地做
int(1/2)
如果您希望将来的 Py 2.X 导入部门具有相同的行为
from __future__ import division
int(1/2)
如果您想知道这种行为的确切原因,请阅读这篇精彩的文章Why Python's Integer Division Floors
看看您在使用 float 进行除法时的困境,这是一种替代方法,据我测试过,它似乎有效。随时让我知道您面临的任何问题
>>> def trunc_div(a,b):
q, r = divmod(a,b)
if q < 0 and r:
q += 1
return q
>>> trunc_div(1,-2)
0
>>> trunc_div(999999999999999999999999999999999999999999, -2)
-499999999999999999999999999999999999999999L
>>> trunc_div(999999999999999999999999999999999999999999, 2)
499999999999999999999999999999999999999999L
>>> trunc_div(1,2)
0
>>>
Python 3 有新式除法(也可以在 Python 2 中用 触发from __future__ import division
):
>>> from __future__ import division
>>> -1 / 2
-0.5
>>> -1 // 2
-1
我不认为你可以得到截断除法,你可能不得不使用 math.floor()。
我认为这解决了你的问题,但它是一个函数调用,而不是一个简单的操作:
def truncdiv(a, b):
if a < 0:
a = -a
b = -b
if b < 0:
return (a + b + 1) / b
return a / b
gmpy2库支持截断除法:
>>> import gmpy2
>>> gmpy2.mpz(-100)//7
mpz(-15)
>>> gmpy2.t_div(gmpy2.mpz(-100),7)
mpz(-14)
>>>
免责声明:我维护 gmpy2。