计算机整数除运算、求余(模)运算的差异性

同样的整数除、求余(模)运算,不同的编程语言、软件可能有不同的结果。

一、示例代码

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在进行异号整数除法运算时,是尽可能的往负无穷的方向舍值。

比如说,数学运算的 5/-2=-2.5

C/C++、JAVA、Python异号整数除法运算中,会往0的方向舍值,也就是-2;

EXCEL异号整数除法运算中,会往负无穷的方向舍值,也就是-3。

因为异号整数除法运算存在如此规则,进而C/C++、JAVA、EXCEL也导致异号整数求余(模)运算也出现同样的规则。

Python较为特殊,Python的异号除法运算,采用往0方向舍值,到了异号求余(模)运算时变成了采用往负无穷方向舍值,这点需要注意!

比如说:

 5/-2=-2 ......1,是确保商往0方向(这里为-2)舍值,然后余出1

5/-2=-3 ...... -1,是确保商往负无穷方向(这里为-3)舍值,然后余出-1

C/C++、JAVA异号整数求余(模)运算中,会往0的方向舍值,也就是1;

EXCEL、Python异号整数求余(模)运算中,会往负无穷的方向舍值,也就是-1。

四、总结

三种计算结果,在计算机科学都是符合运算逻辑的。

一般EXCEL逻辑的运算使用更广泛。

至于需要用什么样的计算逻辑,需要结合特定的场景,与相关接口、人员做好声明协议。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值