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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 回文数的判断(三种方法)

    回文数的判断(三种方法)最近做了一点关于回文数的总结 首先先写一篇关于回文数判断的几种方法 回文数的概念 即是给定一个数 这个数顺读和逆读都是一样的 例如 121 1221 是回文数 123 1231 不是回文数 方法一 试用情境 处理小数字 使用数学方法 输入的回文数 x 的范围为 x lt 10 9 int 存储 或者 x lt 10 18 longlong 存储的数 数字的范围不大 这里写的是 int 存储情况

    2025年8月21日
    4
  • 微型计算机原理与接口技术——8086指令系统之移位指令

    微型计算机原理与接口技术——8086指令系统之移位指令移位指令移动一位时由指令直接给出;移动两位及以上,则移位次数由CL指定。要求操作数不能是立即数;这类指令的执行大多会影响6个状态标志位。非循环移位指令逻辑左移SHL(ShiftLogicLeft)算术左移SAL(ShiftArithmeticLeft)逻辑右移SHR(ShiftLogicRight)算术右移SAR(ShiftArithmeticRight)4条指令的格式完全相同,可实现对8位或16位寄存器操作数或内存操作数进行指定次数的移位。逻辑移位指令针对的

    2022年5月11日
    58
  • 电脑蓝屏0x000000f4解决步骤_win7蓝屏0x0000001a

    电脑蓝屏0x000000f4解决步骤_win7蓝屏0x0000001a各合作伙伴:当前出现部分用户电脑因win7操作系统服役期结束,更新操作系统补丁导致系统蓝屏,错误代码0X000000F4的现象。在此提醒广大伙伴及用户,可尝试按照以下方法进行处理并设置。1、开机按F8进入安全模式,设置操作系统进入干净启动状态。2、打开“开始”-“控制面板”-“系统和安全”-“已安装的更新”,拖到底部“当前已安装的更新”将已安装更新删除。3、点击开始菜单并…

    2022年10月8日
    4
  • java nio_(一) Java NIO 概述[通俗易懂]

    java nio_(一) Java NIO 概述[通俗易懂]一、阻塞IO与非阻塞IO阻塞IO:通常在进行同步I/O操作时,如果读取数据,代码会阻塞直至有可供读取的数据。同样,写入调用将会阻塞直至数据能够写入。传统的Server/Client模式会基于TPR(ThreadperRequest),服务器会为每个客户端请求建立一个线程,由该线程单独负责处理一个客户请求。这种模式带来的一个问题就是线程数量的剧增,大量的线程会增大服务器的开销。大多数的实现为了…

    2022年7月8日
    33
  • Win10安装Matlab R2017a技术指导

    Win10安装Matlab R2017a技术指导下面带来win1064-bitMatlab2017a的安装过程,亲测,可用。(一)所需文件及下载地址1.Matlab-R2017a-ISO镜像文件链接:https://pan.baidu.com/s/1pNhyKGF密码:cgt22.破解文件链接:https://pan.baidu.com/s/1nwWDgKh密码:4fwa链接:https://pan.ba

    2022年5月6日
    52
  • PLC基础知识(PLC入门必看)[通俗易懂]

    PLC基础知识(PLC入门必看)[通俗易懂]1 PLC的发展历程在工业生产过程中,大量的开关量顺序控制,它按照逻辑条件进行顺序动作,并按照逻辑关系进行连锁保护动作的控制,及大量离散量的数据采集。传统上,这些功能是通过气动或电气控制系统来实现的。1968年美国GM(通用汽车)公司提出取代继电气控制装置的要求,第二年,美国数字公司研制出了基于集成电路和电子技术的控制装置,首次采用程序化的手段应用于电气控制,这就是第一代可编程序控制器,称ProgrammableController(PC)。个人计算机(简称PC)发展起来后,为了方便,也为了反映可

    2025年8月28日
    12

发表回复

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

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