Java取模和取余,你真的弄懂了吗?

394 阅读3分钟

概念

通常取模运算也叫取余运算,它们返回结果都是余数  .rem 和 mod 唯一的区别在于:

当 x 和 y 的正负号一样的时候,两个函数结果是等同的;当 x 和 y 的符号不同时,rem 函数结果的符号和 x 的一样,而 mod 和 y 一样。

这是由于这两个函数的生成机制不同,rem 函数采用 fix 函数,而 mod 函数采用了 floor 函数(这两个函数是用来取整的,fix 函数向 0 方向舍入,floor 函数向无穷小方向舍入)。 rem(x,y)命令返回的是 x-n.* y,如果 y 不等于 0,其中的 n = fix(x./y),而 mod(x,y) 返回的是 x-n.* y,当 y 不等于 0 时,n=floor(x./y)

卧槽~ 这是什么鬼 是不是觉得看不懂,下面涛哥用简单的示例来进行介绍,给你整得明明白白的。

Java 示例

我们就创建一个测试类,来进行示例说明

  • 当 x 和 y 的正负号一样的时候,两个函数结果是等同的
package org.taoguoguo.hyper;

/**
 * @author taoguoguo
 * @description ModTest
 * @website https://www.cnblogs.com/doondo
 * @create 2021-04-19 15:11
 */
public class ModTest {
    public static void main(String[] args) {
        System.out.println("7对3取余: " + 7%3 );
        System.out.println("7对3取模: " + Math.floorMod(7,3));

        System.out.println("-7对-3取余: " + (-7) % (-3) );
        System.out.println("7对3取模: " + Math.floorMod(-7,-3));
    }
}

输出结果:

7对3取余: 1
7对3取模: 1
-7对-3取余: -1
7对3取模: -1

当 x 和 y 的符号不同时,rem 函数结果的符号和 x 的一样,而 mod 和 y 一样

package org.taoguoguo.hyper;

/**
 * @author taoguoguo
 * @description ModTest
 * @website https://www.cnblogs.com/doondo
 * @create 2021-04-19 15:11
 * 取余运算结果的符号和 被除数 一致,取模运算结果的符号和 除数 一致
 * 取余,遵循尽可能让商向0靠近的原则
 * 取模,遵循尽可能让商向负无穷靠近的原则
 */
public class ModTest {
    public static void main(String[] args) {
        System.out.println("7对-3取余: " + 7%(-3));
        System.out.println("7对-3取模: " + Math.floorMod(7,-3));

        System.out.println("-7对3取余: " + -7%3);
        System.out.println("-7对3取模: " + Math.floorMod(-7,3));
    }
}

输出结果:

7对-3取余: 1
7对-3取模: -2
-7对3取余: -1
-7对3取模: 2

解析

1.符号相同时:7/3 = 2.3,产生了两个商23
            7=3*2+1	 或者 7=3*3+(-2)
       结论:7rem3=1 , 7mod3=1
	   
2.符号不同时:7/(-3)= -2.-3 产生了两个商-2和-3
            7=(-3)*(-2)+1  或者 7=(-3)*(-3)+(-2)
       结论:7rem(-3)=1 , 7mod(-3)=(-2)

为什么遵循的是这样的原则?

在matlab中,关于取余和取模是这么定义的:

  • 当y≠0时:

    • 取余:rem(x,y)=x-y.* fix(x./y)
    • 取模:mod(x,y)=x-y.* floor(x./y)

    其中,fix()函数是向0取整,floor()函数是向负无穷取整

    以前边的运算为例:

    7/(-3)=-2.3,在这个运算中,x为7,y为-3,分别调用fix()和floor()两个函数,得到结果是:

    fix(-2.3)=-2

    floor(-2.3)=-3

    所以,rem(7,-3)=1,mod(7,-3)=-2

总结

  1. 取余,遵循尽可能让商向0靠近的原则,取模,遵循尽可能让商向负无穷靠近的原则
  2. 符号相同时,两者不会冲突;符号不同时,两者会产生冲突。
  3. 取余运算结果的符号和 被除数 一致,取模运算结果的符号和 除数 一致

转载自:www.cnblogs.com/doondo/p/14…