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为取模

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • matlab画三维函数图像代码_excel绘制三维图形

    matlab画三维函数图像代码_excel绘制三维图形例:用plot3函数绘制三维螺旋线。>>t=linspace(0,10*pi,300);>>plot3(20*sin(t),20*cos(t),t,’r’,’linewidth’,2);>>holdon%图形保持>>quiver3(0,0,0,1,0,0,25,’k’,’filled’,’LineWidth’,2);>>quiver3(0,0,0,0,1,0,25,’k’,’fill

  • 行为识别数据集汇总[通俗易懂]

    行为识别数据集汇总[通俗易懂]工欲善其事,必先利其器http://www.cs.utexas.edu/~chaoyeh/web_action_data/dataset_list.html,此链接内容更全,可惜整理完后发现的。1.TheKTHDataset(2004)KTH数据集于2004年的发布,是计算机视觉领域的一个里程碑。此后,许多新的数据库陆续发布。数据库包括在4个不同场景下25个人完成的6…

  • 简单易学的机器学习算法——梯度提升决策树GBDT「建议收藏」

    简单易学的机器学习算法——梯度提升决策树GBDT「建议收藏」梯度提升决策树(GradientBoostingDecisionTree,GBDT)算法是近年来被提及比较多的一个算法,这主要得益于其算法的性能,以及该算法在各类数据挖掘以及机器学习比赛中的卓越表现,有很多人对GBDT算法进行了开源代码的开发,比较火的是陈天奇的XGBoost和微软的LightGBM。一、监督学习1、监督学习的主要任务监督学习是机器学习算法中重要的一种,对于监督学习,假设有mm…

    2022年10月12日
  • 小树311_森林小道

    小树311_森林小道原题链接森森开了一家快递公司,叫森森快递。因为公司刚刚开张,所以业务路线很简单,可以认为是一条直线上的N个城市,这些城市从左到右依次从0到(N−1)编号。由于道路限制,第i号城市(i=0,⋯,N−2)与第(i+1)号城市中间往返的运输货物重量在同一时刻不能超过C​i​​ 公斤。公司开张后很快接到了Q张订单,其中j张订单描述了某些指定的货物要从S​j​​ 号城市运输到T​j​​ 号城市。这里我们简单地假设所有货物都有无限货源,森森会不定时地挑选其中一部分货物进行运输。安全起见,这些货物不会在中

  • 选择排序算法详解_八大排序算法图解

    选择排序算法详解_八大排序算法图解选择排序就是从待排序的元素中选择最小(最大)的元素,将其放在有序序列的相应位置,使这些元素构成有序序列。选择排序主要有两种:简单选择排序和堆排序。【简单选择排序】编写算法,要求使用简单选择排序算法对元素65、32、71、28、83、7、53、49进行从小到大排序。【算法思想】简单选择排序是一种简单的选择类排序算法,它的基本思想描述如下:假设待排序的元素有n个,在第一趟排序过程…

    2022年10月28日
  • laravel 中使用tinker注入数据到数据库

    laravel 中使用tinker注入数据到数据库

    2021年10月24日

发表回复

您的电子邮箱地址不会被公开。

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