Java别说取余(%)运算简单,你真的会吗?

Java别说取余(%)运算简单,你真的会吗?一,直击现场下面我来抛出几道题:说明m是商,n是余数;(1)正数%正数3%2=m…….n2%3=m…….n(2)正数%负数或者负数%正数-3%2=m…….n3%-2=m…….n-2%3=m…….n2%-3=m…….n(3)负数%负数-3%-2=m…….n-2%-3=m…….n二,验证时刻下面的结果没有商m只有余数n;有没有全部答对呢?没有的话来看总结吧

大家好,又见面了,我是你们的朋友全栈君。

前言:发现有不少人阅读了这篇文章,并且,指出了文章中存在的问题。其实,我本人好久之前也觉得文章的介绍有部分问题,且不够简洁,一直想着做出修改,却一拖再拖。最近两天(2021年7月22日),又接触了取模和取余的相关知识,同时取模和取余有相似之处,也都很容易遇到,所以一起介绍。觉得时机成熟了,是时候对本文做出完善了。

一 取余和取模的定义

对于整型数a,b来说,取模运算或者取余运算的方法都是:

  1. 求整数商: c = a/b
  2. 计算模或者余数: r = a – c*b

取余运算在取c的值时,向0的方向舍入;取模运算在计算c的值时,向负无穷方向舍入

如下图所示:如果c(即a/b的商)的结果为正数,如1.5,那么对于取余和取模的处理是相同的,c舍入后的结果都为1;如果c的结果为负数,如-1.5,那么对于取余是向0的方向舍入,c舍入后的结果为-1,但是,对于取模是向负无穷的方向舍入,舍入后的结果为-2;

在这里插入图片描述
取个例子,3 % -2
c = a / b = 3/-2 = -1.5 c向0的方向舍入为-1
r = a – c * b = 3 – (-1) * (-2) = 1
即3 % -2 = 1

二 取余的规律总结

考虑了a和b可能出现的几乎是所有的情况(除了a等于b的情况,其取余等于0),这样总结的规律更有普遍性。

package com.company.app;

public class RemTest { 
   
    public static void main(String[] args) { 
   
        // a的绝对值大于b
        System.out.println(" 2 % 3 = " + 2 % 3);
        System.out.println("-2 % 3 = " + (-2) % 3);
        System.out.println(" 2 %-3 = " + 2 % (-3));
        System.out.println("-2 %-3 = " + (-2) % (-3));

        System.out.println();

        // a的绝对值小于b
        System.out.println(" 3 % 2 = " + 3 % 2);
        System.out.println("-3 % 2 = " + (-3) % 2);
        System.out.println(" 3 %-2 = " + 3 % (-2));
        System.out.println("-3 %-2 = " + (-3) % (-2));

    }
}

运行结果如下:
在这里插入图片描述
规律:先使用a的绝对值和b的绝对值进行取余运算(或理解成先去掉符号也可以,并且两个正数的取余运算相对容易),然后取余的结果正负号和a保持一致。

我们可以进一步总结出如果a的绝对值小于b的绝对值,则余数就是a。本质还是通过上面的规律计算出来的。

有时候面试题中会让我们计算a/b的商和余数,我们根据上面的计算结果继续总结(可以验算 除数=商*被除数 + 余数):

表达式 除数a / 被除数b 余数
2 / 3 0 2
-2 / 3 0 -2
2 / -3 0 2
-2 / -3 0 -2
3 / 2 1 1
-3 / 2 -1 -1
3 / -2 -1 1
-3 / -2 1 -1

当a的绝对值小于b时,商0,余数为a;
当a的绝对值大于b时,先使用a的绝对值和b的绝对值进行运算,得出商和余数。商的符号,除数a和被除数b的符号相同则为正,不同则为负。余数的符号取决于除数a。

三 取模的规律总结

Java编程语言的%运算实现的是取余运算,而Python编程语言的%运算实现的是取模运算(注意,虽然使用符号相同,但是表示的却是不同的运算)。目前,还未学习Python,本地没有编程环境,使用在线的编辑器运行该代码及其运行结果如下所示:
请添加图片描述

表达式 a mod b (这里mod 表示取模运算)
2 mod 3 2
-2 mod 3 1
2 mod -3 -1
-2 mod -3 -2
3 mod 2 1
-3 mod 2 1
3 mod -2 -1
-3 mod -2 -1

当a和b同号时,先用|a|取余|b|,结果和b的正负号保持一致;

举个例子(下列例子中%表示取余运算,mod表示取模运算,|a|表示a的绝对值,或者理解为去除正负号的a,我们关心的是数值):

a mod b
2 mod 3 --> 2 % 3 = 2 --> 2 (结果和b的正负号保持一致,下同不赘述)
3 mod 2 --> 3 % 2 = 1 --> 1
-2 mod -3 --> 2 % 3 = 2--> -2
-3 mod -2 --> 3 % 2 = 1 --> -1

当a和b异号时,使得|b|>|a|(即如果|b|<|a|,就累加|b|,直达|b|>|a|)然后|b|-|a|,结果和b的正负号保持一致;

a mod b
-2 mod 3 --> 3 - 2 = 1 --> 1(结果和b的正负号保持一致,下同不再赘述)
2 mod -3 --> 3 - 2 = 1 --> -1
3 mod -2 --> (2 < 3,累加|b|) (2 + 2) - 3 = 1 --> -1 
-3 mod 2 --> (2 < 3,累加|b|) (2 + 2) - 3 = 1 --> 1

对上述累加|b|进一步说明,如果100 mod -3,累加3直到大于100为止,这只是为了方便描述,我们一眼可以看出33 * 3 < 100,那这个数就是34 * 3呗。本质就是n|b|>|a|,求n最小值,n|b|就是我们最终要的值。

最后,检测一下自己学会了吗?

表达式中%表示取余或取模 取余结果 取模结果
3 % 7
-3 % 7
3 % -7
-3 % -7
7 % 3
-7 % 3
7 % -3
-7 % -3

下滑查看答案,也可以自己编程验证:)


2021-7-22更新: 一 取余和取模的定义 二 取余的规律总结

2021-10-12更新: 三 取模的规律总结


四 答案

表达式中%表示取余或取模 取余结果 取模结果
3 % 7 3 3
-3 % 7 -3 4
3 % -7 3 -4
-3 % -7 -3 -3
7 % 3 1 1
-7 % 3 -1 2
7 % -3 1 -2
-7 % -3 -1 -1


以下内容同上,不建议阅读


一,直击现场

下面我来抛出几道题:
说明m是商,n是余数;
(1)正数%正数
3%2=m…n
2%3=m…n
(2)正数%负数或者负数%正数
-3%2=m…n
3%-2=m…n
-2%3=m…n
2%-3=m…n
(3)负数%负数
-3%-2=m…n
-2%-3=m…n

二,验证时刻

下面的结果没有商m只有余数n;有没有全部答对呢?没有的话来看总结吧
这里写图片描述

三,总结

(1)
3%2=1…1
2%3=0…1
正数除以正数:

商正余正

(2)
-3%2=-1…-1
3%-2=-1…1
-2%3=0…-2
2%-3=0…2
除数或者被除数其中之一为负数:

先按正数计算,商负余同被除数

(余数和被除数同号)你可能对结果0有疑问,你可以把它当成负0,因为被除数=除数*商+余数,所以被除数是希望商乘以除数的结果是接近它的(如最后一组数被除数2是希望-3乘以0后的结果是接近它的,所以可以理解为0是负0,这样就普遍适用了)
(3)
-3%-2=1…-1
-2%-3=0…-2
两个数都是负数:

先按正数计算,商正余负

(对于第二组可理解为0是正0,解释同上)

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/139695.html原文链接:https://javaforall.net

(0)
上一篇 2022年5月7日 下午5:20
下一篇 2022年5月7日 下午5:20


相关推荐

  • 女生学Java软件开发好就业吗

    女生学Java软件开发好就业吗  java在IT行业非常火热,近几年不仅引起了很多人的关注,女性同胞也非常关注这一行业,想要学习java技术,但是不知道女生学Java软件开发好就业吗?来看看下面的详细介绍就知道了。  女生学Java软件开发好就业吗?目前大多数想要参加Java培训学习女生的一个重要关注的话题,学习不用多说,只要是自己足够的努力,在选择一个靠谱的Java培训机构,还是比较容易学会的。有的时候我们可以看到同样的老师、同样的课程和同样的学习方式,整个Java培训过程下来女生很多是要比男生学习的更好。  所以,在学习

    2022年7月8日
    19
  • pytest-allure_苹果11验机报告

    pytest-allure_苹果11验机报告前言allure是一个report框架,支持java的Junit/testng等框架,当然也可以支持python的pytest框架,也可以集成到Jenkins上展示高大上的报告界面。mac环境:

    2022年7月29日
    7
  • mac idea激活码永久【中文破解版】2022.02.13

    (mac idea激活码永久)好多小伙伴总是说激活码老是失效,太麻烦,关注/收藏全栈君太难教程,2021永久激活的方法等着你。https://javaforall.net/100143.htmlIntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,上面是详细链接哦~4KDDGND3CI-eyJsaWNlbnNlSWQiOi…

    2022年4月1日
    54
  • Promise的含义和用法「建议收藏」

    Promise的含义和用法「建议收藏」含义Promise是异步编程的一种解决方案。Promise对象有以下2个特点:1.对象的状态不受外界影响。Promise对象代表一个异步操作,有三种状态:Pending(进行中)、Resolved(已完成)和Rejected(已失败)。只有异步操作的结果,可以决定当前是哪一种状态,任何其他操作都无法改变这个状态。这也是Promise这个名字的由来,它的英语意思就是“承诺”,表示其…

    2022年5月30日
    36
  • pycharm 修改镜像源_linux镜像源哪个好

    pycharm 修改镜像源_linux镜像源哪个好镜像网站是将一个完全相同的站点放到几个服务器,分别有自己的URL,在这些服务器上互为镜像网站。它和主站并没有太大差别,或者可算是为主站作的后备措施。有了镜像网站的好处是:如果不能对主站作正常访问(如某个服务器死掉或出了意外),但仍能通过其它服务器正常浏览。相对来说主站在速度等各方面比镜像站点略胜一筹。

    2022年8月25日
    11
  • 通过因果图法来写测试用例的步骤_通过因果图写测试用例的步骤

    通过因果图法来写测试用例的步骤_通过因果图写测试用例的步骤一、应用场合在一个界面中,有多个控件,测试的时候要考虑控件的组合关系,不同的控件组合会产生不同的输出结果的组合,为了弄清什么样的输入组合会产生什么样的输出组合,使用因果图法。二、因果图核心1、因——原因,输入条件2、果——结果,输出结果使用图形的方式,分析软件输入和输出的对应关系三、图形符号1、基本图形表示输入和输出的对应关系(1)恒等(=)…

    2022年8月14日
    9

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号