1/2
给
0
正如它应该。然而,
-1/2
给
-1
,但我希望它向 0 舍入(即我希望 -1/2 为 0),无论它是正数还是负数。最好的方法是什么?
1/2
给
0
正如它应该。然而,
-1/2
给
-1
,但我希望它向 0 舍入(即我希望 -1/2 为 0),无论它是正数还是负数。最好的方法是什么?
做浮点除法然后转换为int。不需要额外的模块。
蟒蛇 3:
>>> int(-1 / 2)
0
>>> int(-3 / 2)
-1
>>> int(1 / 2)
0
>>> int(3 / 2)
1
蟒蛇2:
>>> int(float(-1) / 2)
0
>>> int(float(-3) / 2)
-1
>>> int(float(1) / 2)
0
>>> int(float(3) / 2)
1
Python 的默认整数除法是返回下限(朝向负无穷大),但无法更改。您可以阅读BDFL 的原因。
要进行“向上”除法,您将使用:
>>> a=1
>>> b=2
>>> (a+(-a%b))//b
1
>>> a,b=-1,2
>>> (a+(-a%b))//b
0
要对零进行截断并保持整数除法,(a+(-a%b))//b
如果 a 或 b 为负数,则使用默认除法,如果两者都是正数,则使用默认除法。
这将进行整数除法并始终向零舍入:
>>> a=1
>>> b=2
>>> a//b if a*b>0 else (a+(-a%b))//b
0
>>> a=-1
>>> b=2
>>> a//b if a*b>0 else (a+(-a%b))//b
0
>>> a,b=-3,2
>>> a//b if a*b>0 else (a+(-a%b))//b
-1
>>> a,b=3,2
>>> a//b if a*b>0 else (a+(-a%b))//b
1
有趣的是,C99 声明向零舍入是默认值:
#include <stdio.h>
int main(int argc, const char * argv[])
{
int a=-3;
int b=2;
printf("a=%d, b=%d, a/b=%d\n",a,b,a/b);
a=3;
printf("a=%d, b=%d, a/b=%d\n",a,b,a/b);
return 0;
}
印刷:
a=-3, b=2, a/b=-1
a=3, b=2, a/b=1
对于它的价值,我自己最喜欢的解决方案是这个。仅整数运算,单次除法,以及其他所有线性时间:
def integer_divide_towards_zero(a, b):
return -(-a // b) if a < 0 else a // b
假设这b
是积极的,但在我见过的大多数应用程序中都是如此。如果你也需要处理负数b
,那么函数会变得稍微复杂一些:
def integer_divide_towards_zero(a, b):
return -(-a // b) if (a < 0) ^ (b < 0) else a // b
一些示例输出:
>>> integer_divide_towards_zero(11, 3)
3
>>> integer_divide_towards_zero(-11, 3)
-3
>>> integer_divide_towards_zero(6, 3)
2
>>> integer_divide_towards_zero(-6, 3)
-2
>>> integer_divide_towards_zero(11, -3)
-3
>>> integer_divide_towards_zero(-11, -3)
3
当有一个非常好的 math.trunc() 函数时,为什么要重新发明轮子?
import math
print(math.trunc(-3.5))
>>-3
print(math.trunc(3.5))
>>3
尝试这个。仅适用于大于 -1 的数字
import math
x = .5
y = -.5
print math.floor(math.fabs(x))
>> 0
print math.floor(math.fabs(y))
>> 0
在我看来,执行此操作的正确代码太晦涩难懂,无法编写为 1-liner。所以我把它放在一个函数中,比如:
def int0div(a, b):
q = a // b
if q < 0 and b*q != a:
q += 1
return q
好的特性:它适用于任何大小的 int,a//b
除非必要,否则不对原始 ( ) 结果进行任何调整,只进行一次除法(%
也在幕后进行除法),并且不会创建任何大于输入。这些在您的申请中可能很重要,也可能无关紧要;如果您使用“大”整数,它们会变得更加重要(对于速度)。
把我的帽子扔进一些替代的想法:
将数字 [abs(x)/x] 的符号乘以 abs(x)/2
(abs(x)/x)*(abs(x)/2)
执行加法,但如果数字小于零,则加一以使其更接近 0。
x/2 + int(x<0)
您还可以将Decimal模块用作标准 python 库的一部分。
具体来说,“ 整数除法运算符 // 行为类似,返回真商的整数部分(向零截断)而不是其底数,以保持通常的恒等式 x == (x // y) * y + x %y:"
>>> -7 // 4
-2
>>> Decimal(-7) // Decimal(4)
Decimal('-1')
此外,请查看舍入模式,因为它们有很多方法可以查看/舍入您的信息 - 天花板、向下、地板、半向下、半均匀、半向上、向上和 05 向上舍入。
Decimal 是作为传统二进制数学问题的解决方案而编写的