Java取余和取模

Java取余和取模抛开高级语言的实现,取余运算和取模运算本身并不完全一致,区别在于对负整数进行取商时操作不同。虽然这样说,但是取余运算和取模运算的公式都一样。对于x和y两个整数(int),通过以下两个操作获取余数或模数:step1、求商:intz=x/ystep2、求余数或模数:intresult=x-y*z它们的差别在于,如果z的值…

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

抛开高级语言的实现,取余运算和取模运算本身并不完全一致,区别在于对负整数进行取商时操作不同。虽然这样说,但是取余运算和取模运算的公式都一样。对于x和y两个整数(int),通过以下两个操作获取余数或模数:

           step1、求商:int z  = x / y

           step2、求余数或模数:int result = x – y * z

它们的差别在于,如果z的值是负数且不为整数(如果z为整数,那么余数和模数都为0了嘛)时,该怎么取整,比如z == -1.33,那么z取整的结果是 -1 还是 -2 的区别;如果为正数则没有区别。所以我们只需要注意,x和y异号,且x不被y整除的情况。

先给出规则,如果z小于0,且z不为整数(即x没有被y整除),那么:

如果是取余:那么z朝0方向取整,即:-1.33 => -1

如果是取模:那么z朝负无穷方向取整,即:-1.33 => -2

举个例子:x = -4,y = 3,x / y = -1.33…

如果是取余:那么z = -1,result == -4 – 3 * (-1) == -1

如果是取模:那么z = -2,result == -4 – 3 * (-2) == 2

所以大家不要再把取余和取模混为一谈啦!在Java中,%是取余数,取模的操作是:Math.floorMod,我们可以看一下Java的取模操作是怎么实现的(以下为java源码,只是我加上了注释):

/**
 *计算 x - z
 */
public static int floorMod(int x, int y) {
      int r = x - floorDiv(x, y) * y;
      return r;
}

/**
 * 计算z
 */
public static int floorDiv(int x, int y) {
       //这里其实是强转操作,是朝0方向取整的
       int r = x / y;
       if ((x ^ y) < 0 && (r * y != x)) {
           //如果x和y异号且x/y不是整数(也就是x没有被y整除),那么将r-1返回
           //由于r在上一步已经朝0方向取整了,将r-1就实现了朝负无穷方向取整
           r--;
       }
       return r;
}

注:不同的语言,对于%运算符的含义可能是不一样的,比如c、c++、java 为取余,而python为取模

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

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

赞 (0)
全栈程序员-站长的头像全栈程序员-站长

相关推荐

  • MySql必知必会实战练习(五)存储过程

    1.为什么使用存储过程?(1)通过把处理封装在容易使用的单元中,简化复杂操作(2)为了保证数据的完整性,不要求反复建立一系列的处理操作,所有开发人员和应用程序都使用同一(试验和测试)存储过程

    2021年12月29日
  • 遍历ArrayList,并删除某些元素的方法实现「建议收藏」

    遍历ArrayList,并删除某些元素的方法实现「建议收藏」本文是根据https://blog.csdn.net/qq_32575047/article/details/78902254的帖子进行整理的,在此感谢一下。题目:一个ArrayList对象aList中存有若干个字符串元素,现欲遍历该ArrayList对象,删除其中所有值为”abc”的字符串元素,请用代码实现。publicclassTest1{public…

    2022年9月30日
  • CentOS镜像下载「建议收藏」

    CentOS镜像下载「建议收藏」CentOS6系统安装1、首先打开网易开源镜像站:http://mirrors.163.com/当然,大家也可以使用阿里开源镜像站:http://mirrors.aliyun.com/2、点击进入centos目录。3、因为我们选择安装centos6.5版本系统,所以点击进入6.5/目录4、我们打开里面的readme文件,找到下载地址:http://vault.cento…

    2022年6月9日
  • webgame开发中常用的一些类

    webgame开发中常用的一些类这个只是自己在开发游戏过程中所总结出来的,仅供参考。1、加载队列QueueLoader,游戏一定是有很多的资源需要加载,这个类可以让资源以顺序进行加载;2、ZIP解压工具类nochump类,这里有之前写过的例子–>使用as工具包解压zip文件。这里还有另外一个Zip处理类ZipArchive3、声音管理类SoundManager,游戏一般都有很多音乐需要管理:…

    2022年6月3日
  • Flashfxpv.3.5.4注册码

    Flashfxpv.3.5.4注册码在安装好任意版本的Flashfxp之后,只要在注册栏中,全盘粘贴一下文字就可以了^_^——–FlashFXPRegistrationDataSTART——–FLASHFXPwQAOlhkgwQAAAAC6W5MNJwTnsl73nIraAU149tnCQS0hmZU3GGBQG1FtoSp5x0mUgA7bFW0qr0fKk2KCA+v2CCrFbF+q

    2022年7月26日
  • Redis Desktop Manager的下载及安装,免费

    Redis Desktop Manager的下载及安装,免费1.下载链接百度云盘提取密码:wt462.安装教程傻瓜式安装,,点下一步即可3.连接服务器hosts必填,名字自己起一个个性点的就行,密码需要看你服务器有没有密码

    2022年10月20日

发表回复

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

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