为了 Build 上下文,我只讨论整数运算,在大整数上,所以通过浮点不是一个选项,并使用负数,所以floored和truncated division之间的区别很重要 .
当对负整数执行除法时,典型的硬件和C族编程语言给出截断的结果,例如1 / -2 = 0.Python 2给出了内置结果,例如1 / -2 = -1 .
尽管有关哪个本质上更好的论点,有没有办法让Python给出截断的结果?如果使用Python 3而不是2,它会有什么不同吗?
好吧,如果你只是想要一个解决方案,请记住 int 截断数字,所以不要做整数除法,而是用 int 截断浮点数
int
int(1./-2)
如果您使用的是Python 3.X,那么您可以这样做
int(1/2)
如果你希望将来在Py 2.X import division中有相同的行为
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
>>> 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 .
4 回答
好吧,如果你只是想要一个解决方案,请记住
int
截断数字,所以不要做整数除法,而是用int
截断浮点数如果您使用的是Python 3.X,那么您可以这样做
如果你希望将来在Py 2.X import division中有相同的行为
如果您想知道这种行为的确切原因,请阅读这篇精彩的文章Why Python's Integer Division Floors
看看你使用float进行划分的困境,这是一种替代方法,就我测试而言似乎正在起作用 . 请随时告诉我您遇到的任何问题
Python 3具有新式划分(也可以在Python 2中使用
from __future__ import division
触发):我不认为你可以得到截断的除法,你可能不得不使用math.floor() .
我认为这解决了你的问题,但它是一个函数调用,而不是一个简单的操作:
gmpy2库支持截断的除法:
免责声明:我维持gmpy2 .