bla*_*nce 17 python rounding division integer-division negative-number
1/2
Run Code Online (Sandbox Code Playgroud)
给
0
Run Code Online (Sandbox Code Playgroud)
正如它应该.然而,
-1/2
Run Code Online (Sandbox Code Playgroud)
给
-1
Run Code Online (Sandbox Code Playgroud)
,但我希望它向0舍入(即我希望-1/2为0),无论它是正还是负.最好的方法是什么?
Tim*_*Tim 19
浮点除法然后转换为int.无需额外的模块.
>>> int(float(-1)/2)
0
>>> int(float(-3)/2)
-1
>>> int(float(1)/2)
0
>>> int(float(3)/2)
1
Run Code Online (Sandbox Code Playgroud)
当有一个完美的 math.trunc() 函数时,为什么要重新发明轮子呢?
import math
print(math.trunc(-3.5))
>>-3
print(math.trunc(3.5))
>>3
Run Code Online (Sandbox Code Playgroud)
对于它的价值,我自己最喜欢的解决方案是这个。仅整数算术,单除法,以及其他所有线性时间:
def integer_divide_towards_zero(a, b):
return -(-a // b) if a < 0 else a // b
Run Code Online (Sandbox Code Playgroud)
假设这b是肯定的,但在我见过的大多数应用程序中都是如此。如果你也需要处理负数b,那么函数会稍微复杂一些:
def integer_divide_towards_zero(a, b):
return -(-a // b) if (a < 0) ^ (b < 0) else a // b
Run Code Online (Sandbox Code Playgroud)
一些示例输出:
>>> 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
Run Code Online (Sandbox Code Playgroud)
Python的默认整数除法返回底线(朝向负无穷大),无法改变它.你可以阅读 BDFL的原因.
要做'向上'分工,你会使用:
>>> a=1
>>> b=2
>>> (a+(-a%b))//b
1
>>> a,b=-1,2
>>> (a+(-a%b))//b
0
Run Code Online (Sandbox Code Playgroud)
要向零截断并保持整数除法,(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
Run Code Online (Sandbox Code Playgroud)
有趣的是,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;
}
Run Code Online (Sandbox Code Playgroud)
打印:
a=-3, b=2, a/b=-1
a=3, b=2, a/b=1
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
21560 次 |
| 最近记录: |