当前位置 博文首页 > 小龙狗的博客:除数或被除数为负数时求余数问题
首先可以看到不同编程语言下,求余数结果是不同的。我试了一些,具体如下。
算式/结果 | C++ | Java | JavaScript | Python |
---|---|---|---|---|
5 % -2 | 1 | 1 | 1 | -1 |
-5 % 2 | -1 | -1 | -1 | 1 |
-5 % -2 | -1 | -1 | -1 | -1 |
5 % -3 | 2 | 2 | 2 | -1 |
-5 % 3 | -2 | -2 | -2 | 1 |
-5 % -3 | -2 | -2 | -2 | -2 |
5 % -4 | 1 | 1 | 1 | -3 |
-5 % 4 | -1 | -1 | -1 | 3 |
-5 % -4 | -1 | -1 | -1 | -1 |
为什么会有这样的结果?
因为 不同编程语言对 % 运算符的定义不同。
取模运算(“Modulo Operation”)和取余运算(“Complementation ”)是有重叠部分但又不完全一致的两个概念。当除数和被除数均大于0时,求模运算和求余运算一致。而对于对 负整数 进行除法运算时操作却不同。取模主要是用于计算机术语中,取余则更多是数学概念。
假设有式子(a除以b等于c余数r):
a
÷
b
=
c
?
?
?
r
a ÷ b = c ··· r
a÷b=c???r
当 a,b 均大于 0 时,求模运算和求余运算所得的 c 的值一致,r >= 0, 当 a 或 b 有负数时,见下。
求余 运算时,当 r 不为 0, r 的符号和 a 一致。即 余数符号和被除数符号必须相同。
求模 运算时,取除法的整数商默认优先取地板商,即往负无穷方向取最邻近整数。模运算具体实现过程为:
举例 | 说明 |
---|---|
5 mod -2 = 1 | 商 = -2 或 -3,-3<-2,取商=-3,余 = -1 |
-5 mod 2 = 1 | 商 = -2 或 -3,-3<-2,取商=-3,余 = 1 |
-5 mod -2 = 1 | 商 = 2 或 3,2<3,取商=2,余 = -1 |
估计同学们也用不到这些,就算是做个记录吧。
[root@VM-0-9-centos YushuTest]# cat JavaTest.java
public class JavaTest
{
public static void main(String[] args)
{
System.out.println("5 % -2 = " + (5%(-2)));
System.out.println("-5 % 2 = " + ((-5)%2));
System.out.println("-5 % -2 = " + ((-5)%(-2)));
System.out.println("5 % -3 = " + (5%(-3)));
System.out.println("-5 % 3 = " + ((-5)%3));
System.out.println("-5 % -3 = " + ((-5)%(-3)));
System.out.println("5 % -4 = " + (5%(-4)));
System.out.println("-5 % 4 = " + ((-5)%4));
System.out.println("-5 % -4 = " + ((-5)%(-4)));}
}
[root@VM-0-9-centos YushuTest]# javac JavaTest.java
[root@VM-0-9-centos YushuTest]# java JavaTest
5 % -2 = 1
-5 % 2 = -1
-5 % -2 = -1
5 % -3 = 2
-5 % 3 = -2
-5 % -3 = -2
5 % -4 = 1
-5 % 4 = -1
-5 % -4 = -1
[root@VM-0-9-centos YushuTest]# cat CppTest.cpp
#include<iostream>
using namespace std;
int main()
{
cout<<"5 % -2 = "<<(5%(-2))<<endl;
cout<<"-5 % 2 = "<<((-5)%2)<<endl;
cout<<"-5 % -2 = "<<((-5)%(-2))<<endl;
cout<<"5 % -3 = "<<(5%(-3))<<endl;
cout<<"-5 % 3 = "<<((-5)%3)<<endl;
cout<<"-5 % -3 = "<<((-5)%(-3))<<endl;
cout<<"5 % -4 = "<<(5%(-4))<<endl;
cout<<"-5 % 4 = "<<((-5)%4)<<endl;
cout<<"-5 % -4 = "<<((-5)%(-4))<<endl;
return 0;
}
[root@VM-0-9-centos YushuTest]# g++ CppTest.cpp -o CppTest
[root@VM-0-9-centos YushuTest]# ./CppTest
5 % -2 = 1
-5 % 2 = -1
-5 % -2 = -1
5 % -3 = 2
-5 % 3 = -2
-5 % -3 = -2
5 % -4 = 1
-5 % 4 = -1
-5 % -4 = -1
[root@VM-0-9-centos YushuTest]# python
Python 2.7.5 (default, Apr 2 2020, 13:16:51)
[GCC 4.8.5 20150623 (Red Hat 4.8.5-39)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> 5 % (-2)
-1
>>> (-5) % 2
1
>>> (-5) % (-2)
-1
>>> 5 % (-3)
-1
>>> (-5) % 3
1
>>> (-5) % (-3)
-2
>>> 5 % (-4)
-3
>>> (-5) % 4
3
>>> (-5) % (-4)
-1
Javascript就直接在浏览器控制台里算的,结果如下
> 5 % (-2)
> 1
> (-5) % 2
> -1
> (-5) % (-2)
> -1
> 5 % (-3)
> 2
> (-5) % 3
> -2
> (-5) % (-3)
> -2
> 5 % (-4)
> 1
> (-5) % 4
> -1
> (-5) % (-4)
> -1
.
.
.
.
.
.
桃花仙人种桃树,又摘桃花换酒钱_
cs