同样的整数除、求余(模)运算,不同的编程语言、软件可能有不同的结果。
一、示例代码
1.C++代码
#include <iostream>
using namespace std;
int main(int argc,char** argv){
cout<<"C++\t 2/5 = "<<2 / 5 <<" \t 2/-5 = "<<2 / -5<<" \t -2/5 = "<<-2 / 5<<" \t -2/-5 = "<<-2 / -5<<endl;
cout<<"C++\t 5/2 = "<<5 / 2 <<" \t 5/-2 = "<<5 / -2<<" \t -5/2 = "<<-5 / 2<<" \t -5/-2 = "<<-5 / -2<<endl;
cout<<"C++\t 0/2 = "<<0 / 2 <<endl;
cout<<"C++\t 2%5 = "<<2 % 5 <<" \t 2%-5 = "<<2 % -5<<" \t -2%5 = "<<-2 % 5<<" \t -2%-5 = "<<-2 % -5<<endl;
cout<<"C++\t 5%2 = "<<5 % 2 <<" \t 5%-2 = "<<5 % -2<<" \t -5%2 = "<<-5 % 2<<" \t -5%-2 = "<<-5 % -2<<endl;
cout<<"C++\t 0%2 = "<<0 % 2 <<endl;
cin.get();
return 0;
}
运行结果:
2.Java代码
public class test{
public static void main(String[] args) {
System.out.printf("JAVA\t 2/5 = %d\t 2/-5 = %d\t -2/5 = %d\t -2/-5 = %d\n",2/5,2/-5,-2/5,-2/-5);
System.out.printf("JAVA\t 5/2 = %d\t 5/-2 = %d\t -5/2 = %d\t -5/-2 = %d\n",5/2,5/-2,-5/2,-5/-2);
System.out.printf("JAVA\t 0/2 = %d\n",0/2);
System.out.printf("JAVA\t 2%%5 = %d\t 2%%-5 = %d\t -2%%5 = %d\t -2%%-5 = %d\n",2%5,2%-5,-2%5,-2%-5);
System.out.printf("JAVA\t 5%%2 = %d\t 5%%-2 = %d\t -5%%2 = %d\t -5%%-2 = %d\n",5%2,5%-2,-5%2,-5%-2);
System.out.printf("JAVA\t 0%%2 = %d\n",0/2);
}
}
运行结果:
3.Python代码
#!/usr/python
#-*- coding:utf-8 -*-
import os
def Python_Division(Dividend, Divisor):
return int(Dividend/Divisor)
if __name__ == '__main__':
#print(Python_Division(-2,5))
print("Python\t 2/5 = %d\t 2/-5 = %d\t -2/5 = %d\t -2/-5 = %d\t" % (int(2/5),int(2/-5),int(-2/5),int(-2/-5)))
print("Python\t 5/2 = %d\t 5/-2 = %d\t -5/2 = %d\t -5/-2 = %d\t" % (int(5/2),int(5/-2),int(-5/2),int(-5/-2)))
print("Python\t 0/2 = %d" % (int(0/2)))
print("Python\t 2%%5 = %d\t 2%%-5 = %d\t -2%%5 = %d\t -2%%-5 = %d\t" % (int(2%5),int(2%-5),int(-2%5),int(-2%-5)))
print("Python\t 5%%2 = %d\t 5%%-2 = %d\t -5%%2 = %d\t -5%%-2 = %d\t" % (int(5%2),int(5%-2),int(-5%2),int(-5%-2)))
print("Python\t 0%%2 = %d" % (int(0%2)))
运行结果:
二、整理数据与发现
EXCEL的运算结果如下:
C/C++、JAVA的运算结果如下:
Python的运算结果如下:
注意观察结果会发现:
在被除数、除数同号的情况下,四种语言运算结果都是一致的;
在被除数、除数异号的情况下,四种语言运算结果出现差异:
C/C++、JAVA的除法、求余运算结果都一致;
Python的除法运算结果与C/C++、JAVA的一致,唯独EXCEL与他们不同;
Python的求余(模)运算结果与EXCEL的一致,与C/C++、JAVA的有差异;
三、为什么会这样呢?谁对谁错?
1.首先要说明的是,三种结果不分对错,都是符合计算机科学的运算规则的;
2.出现这样的原因在于:
C/C++、JAVA、Python在进行异号整数除法运算时,是尽可能的往0的方向舍值;
EXCEL在进行异号整数除法运算时,是尽可能的往负无穷的方向舍值。
比如说,数学运算的 ,
在C/C++、JAVA、Python的异号整数除法运算中,会往0的方向舍值,也就是-2;
在EXCEL的异号整数除法运算中,会往负无穷的方向舍值,也就是-3。
因为异号整数除法运算存在如此规则,进而C/C++、JAVA、EXCEL也导致异号整数求余(模)运算也出现同样的规则。
Python较为特殊,Python的异号除法运算,采用往0方向舍值,到了异号求余(模)运算时变成了采用往负无穷方向舍值,这点需要注意!
比如说:
,是确保商往0方向(这里为-2)舍值,然后余出1;
,是确保商往负无穷方向(这里为-3)舍值,然后余出-1。
在C/C++、JAVA的异号整数求余(模)运算中,会往0的方向舍值,也就是1;
在EXCEL、Python的异号整数求余(模)运算中,会往负无穷的方向舍值,也就是-1。
四、总结
三种计算结果,在计算机科学都是符合运算逻辑的。
一般EXCEL逻辑的运算使用更广泛。
至于需要用什么样的计算逻辑,需要结合特定的场景,与相关接口、人员做好声明协议。