为了建立上下文,我只讨论整数运算,在大整数上,所以通过浮点不是一个选项,并且使用负数,所以floored和truncated division之间的区别很重要。
当对负整数执行除法时,典型的硬件和C族编程语言会给出截断的结果,例如: 1 / -2 = 0.Python 2给出了内置结果,例如1 / -2 = -1。
尽管有关哪个本质上更好的论点,有没有办法让Python给出截断的结果?如果使用Python 3而不是2,它会有什么不同吗?
答案 0 :(得分: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
看看你使用浮动进行划分的困境,这是一种替代方法,似乎在我测试的过程中起作用。请随时告诉我您遇到的任何问题
>>> 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
>>>
答案 1 :(得分:1)
Python 3具有新式划分(也可以在Python 2中使用from __future__ import division
触发):
>>> from __future__ import division
>>> -1 / 2
-0.5
>>> -1 // 2
-1
我认为你不能截断分割,你可能不得不使用math.floor()。
答案 2 :(得分:1)
我认为这解决了你的问题,但它是一个函数调用,而不是一个简单的操作:
def truncdiv(a, b):
if a < 0:
a = -a
b = -b
if b < 0:
return (a + b + 1) / b
return a / b
答案 3 :(得分:0)
gmpy2库支持截断分割:
>>> import gmpy2
>>> gmpy2.mpz(-100)//7
mpz(-15)
>>> gmpy2.t_div(gmpy2.mpz(-100),7)
mpz(-14)
>>>
免责声明:我维持gmpy2。