7

为了建立上下文,我只讨论整数算术,在大整数上,所以通过浮点不是一种选择,并且使用负数,所以地板和截断除法之间的区别很重要。

在对负整数执行除法时,典型的硬件和 C 系列编程语言会给出截断的结果,例如 1 / -2 = 0。Python 2 给出下限的结果,例如 1 / -2 = -1。

尽管关于哪个本质上更好的争论,有没有办法让 Python 给出截断的结果?如果您使用 Python 3 而不是 2,会有什么不同吗?

4

4 回答 4

7

好的,如果您只是想要一个解决方案,请记住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
>>> 
于 2013-03-26T09:48:47.713 回答
1

Python 3 有新式除法(也可以在 Python 2 中用 触发from __future__ import division):

>>> from __future__ import division
>>> -1 / 2
-0.5
>>> -1 // 2
-1

我不认为你可以得到截断除法,你可能不得不使用 math.floor()。

于 2013-03-26T09:47:43.323 回答
1

我认为这解决了你的问题,但它是一个函数调用,而不是一个简单的操作:

def truncdiv(a, b):
    if a < 0:
        a = -a
        b = -b
    if b < 0:
        return (a + b + 1) / b
    return a / b
于 2013-03-26T10:18:09.107 回答
0

gmpy2库支持截断除法

>>> import gmpy2
>>> gmpy2.mpz(-100)//7
mpz(-15)
>>> gmpy2.t_div(gmpy2.mpz(-100),7)
mpz(-14)
>>> 

免责声明:我维护 gmpy2。

于 2013-03-26T13:07:37.913 回答