java 取模与取余的区别说明

取模与取余的区别

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

1.求 整数商: c = a/b;

2.计算模或者余数: r = a - c * b

求模运算和求余运算在第一步不同: 取余运算在取c的值时,向0 方向舍入(fix()函数);而取模运算在计算c的值时,向负无穷方向舍入(floor()函数)。

例如计算:-7 Mod 4

那么:a = -7;b = 4;

第一步:求整数商c,如进行求模运算c = -2(向负无穷方向舍入),求余c = -1(向0方向舍入);

第二步:计算模和余数的公式相同,但因c的值不同,求模时r = 1,求余时r = -3。

归纳:当a和b符号一致时,求模运算和求余运算所得的c的值一致,因此结果一致。

当符号不一致时,结果不一样。求模运算结果的符号和b一致,求余运算结果的符号和a一致。

另外各个环境下%运算符的含义不同,比如c/c++,java 为取余,而python则为取模。

Java程序示例:

public static void main(String[] args) {
 System.out.println("-3,2取模"+Math.floorMod(-3,2));
 System.out.println("-3,2取余"+ -3%2);
 System.out.println("3,-2取模"+Math.floorMod(3,-2));
 System.out.println("3,2取余"+ 3%-2);
 }

结果:

-3,2取模=1

-3,2取余=-1

3,-2取模=-1

3,2取余=1

补充知识:java中的除法和取余注意点

1 整数除法中,除数为0,抛出一个算术异常ArithmeticException。整数取余运算中,除数为0,抛出一个ArithmeticException异常。

如:

 class Test
 {
 public static void main(String args[])
 {
 System.out.println(3/0);
 System.out.println(3%0);
 }
 }

2 小数除法中,除数为0,输出一个Infinity常量。小数取余运算中,除数为0,抛出一个NaN常量。浮点数有无限值和Nan(非数值)概念。

如:

 class Test
 {
 public static void main(String args[])
 {
 System.out.println(3.0/0);
 System.out.println(3.0%0);
 }
 }

3 NaN是java语言中特有的数,由Float 和 Double两个封装类提供,且不能把它作为一个普通数用于运算中,如==运算,NaN用于比较运算中,不会显示错误,但都只输出false。因此NaN只是通过调用isNaN()方法来判定是否一个东西是否数值;但在equals()方法中比较的是内容,就看具体数据了。

如:

 class Test
 {
 public static void main(String args[])
 {
 double x = 64.0;
 double y = 0.0;

 System.out.println(x%y == x%y);
 }
 }

显示:false

如:

 Double a = new Double(Double.NaN);
 Double b = new Double(Double.NaN);

 if(Double.NaN == Double.NaN)
 System.out.println("True");
 else
 System.out.println("False");

 if(a.equals(b))
 System.out.println("True");
 else
 System.out.println("False");

显示:false,true

而Infinity(极限数)即可进行比较,POSITIVE_INFINITY(正无穷)和NEGATIE_INFINITY(负无穷),可用于比较逻辑运算中。

如:

class Test
 {
 public stativ void main(String args[])
 {
 System.out.println(Float.NaN == Float.NaN);
 System.out.println(Float.POSITIVE_INFINITY == Float.POSITIVE_INFINITY)
 }
 }

显示:false,true

3 在取余操作中,余数的正负符号完全取决于左操作数,和作操作数的正负号一致。

如:

 class Test
 {
 public static void main(String args[])
 {
 byte x = -64;
 byte y = -6;

 System.out.println(x/y + " " + x%y);

 x = 64;
 System.out.println(x/y + " " + x%y);
 }
 }

显示:10,-4 -10 4

4 小数取余,用左边的操作数连续减去右边的操作数,直到结果小于右边的操作数,此结果为余。即对商截去小数位后的运算。

如:

 class Test
 {
 public static void main(String args[])
 {
 double x = 64.5;
 double y = 6.0;

 System.out.println(x/y + " " + x%y);
 }
 }

显示:10.75,4.5

以上这篇java 取模与取余的区别说明就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

时间: 2020-10-17

Java中的相除(/)和取余(%)的实现方法

取模运算与取余运算两个概念有重叠的部分但又不完全一致.主要的区别在于对负整数进行除法运算时操作不同. 对于整形数a,b来说,取模运算或者求余运算的方法都是: 1.求 整数商 c = a / b: 2.计算模或者余数 r = a - c* b . 取模运算和取余运算在第一步不同: 取余运算在取c值时,向0方向舍入:而取模运算在取c值时,是向负无穷方向舍入 各个环境下运算符%的含义不同,C/C++,Java为取余,python为取模 Java取余运算规则如下: a%b = a - (a/b)*b 让

浅析java中的取整(/)和求余(%)

1.取整运算符 取整从字面意思理解就是被除数到底包含几个除数,也就是能被整除多少次,那么它有哪些需要注意的地方呢?先看下面的两端代码: int a = 10; int b = 3; double c= a / b; System.out.println(c); 第一段代码的运行结果是3.0, 其中double c = a / b;//c = (10/3) = (double)3 = 3.0,这里面涉及到一个低精度到高精度的隐式装换. int a = 10; int b = 3; double c

Java中ArrayList的removeAll方法详解

本文介绍的是关于Java中ArrayList的removeAll方法的相关内容,分享出来供大家参考学习,下面来一起看看详细的介绍: 在开发过程中,遇到一个情况,就是从所有骑手Id中过滤没有标签的骑手Id(直接查询没有标签的骑手不容易实现), List<Integer> allRiderIdList = new ArrayList(); // 所有的骑手,大致有23W数据 List<Integer> hasAnyTagRiderId = new ArrayList(); // 有标签

Java中Arraylist动态扩容方法详解

前言 本文主要给大家介绍了关于Java中Arraylist动态扩容的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧. ArrayList 概述 ArrayList是基于数组实现的,是一个动态数组,其容量能自动增长.ArrayList不是线程安全的,只能用在单线程环境下.实现了Serializable接口,因此它支持序列化,能够通过序列化传输:实现了RandomAccess接口,支持快速随机访问,实际上就是通过下标序号进行快速访问:实现了Cloneable接口,能被克隆.

java 中迭代器的使用方法详解

java 中迭代器的使用方法详解 前言: 迭代器模式将一个集合给封装起来,主要是为用户提供了一种遍历其内部元素的方式.迭代器模式有两个优点:①提供给用户一个遍历的方式,而没有暴露其内部实现细节:②把元素之间游走的责任交给迭代器,而不是聚合对象,实现了用户与聚合对象之间的解耦. 迭代器模式主要是通过Iterator接口来管理一个聚合对象的,而用户使用的时候只需要拿到一个Iterator类型的对象即可完成对该聚合对象的遍历.这里的聚合对象一般是指ArrayList,LinkedList和底层实现为数

java 中enum的使用方法详解

java 中enum的使用方法详解 enum 的全称为 enumeration, 是 JDK 1.5 中引入的新特性,存放在 java.lang 包中. 下面是我在使用 enum 过程中的一些经验和总结. 原始的接口定义常量 public interface IConstants { String MON = "Mon"; String TUE = "Tue"; String WED = "Wed"; String THU = "Thu

Java中的== 和equals()方法详解与实例

Java中的== 和equals()方法: Java中的数据类型,可分为两类: 1.基本数据类型,也称原始数据类型. byte,short,char,int,long,float,double,boolean,他们之间的比较,应用双等号(==),比较的是他们的值. 2.引用数据类型(类) 当它们用(==)进行比较的时候,比较的是他们在内存中的存放地址,所以,除非是同一个new出来的对象,他们的比较后的结果为true,否则比较后结果为false. Java当中所有的类都是继承于Object这个基类

java中set接口使用方法详解

java中的set接口有如下的特点: 不允许出现重复元素: 集合中的元素位置无顺序: 有且只有一个值为null的元素. 因为java中的set接口模仿了数学上的set抽象,所以,对应的数学上set的特性为: 互异性:一个集合中,任何两个元素都认为是不相同的,即每个元素只能出现一次. 无序性:一个集合中,每个元素的地位都是相同的,元素之间是无序的.集合上可以定义序关系,定义了序关系后,元素之间就可以按照序关系排序.但就集合本身的特性而言,元素之间没有必然的序. 空集的性质:空集是一切集合的子集 S

Java中终止线程的方法详解

Java中终止线程的方式主要有三种: 1.使用stop()方法,已被弃用.原因是:stop()是立即终止,会导致一些数据被到处理一部分就会被终止,而用户并不知道哪些数据被处理,哪些没有被处理,产生了不完整的"残疾"数据,不符合完整性,所以被废弃.So, forget it! 2.使用volatile标志位 看一个简单的例子: 首先,实现一个Runnable接口,在其中定义volatile标志位,在run()方法中使用标志位控制程序运行 public class MyRunnable i

Java中常用加密/解密方法详解

安全问题已经成为一个越来越重要的问题,在Java中如何对重要数据进行加密解密是本文的主要内容. 一.常用的加密/解密算法 1.Base64 严格来说Base64并不是一种加密/解密算法,而是一种编码方式.Base64不生成密钥,通过Base64编码后的密文就可以直接"翻译"为明文,但是可以通过向明文中添加混淆字符来达到加密的效果. 2.DES DES是一种基于56位密钥的对称算法,1976年被美国联邦政府的国家标准局确定为联邦资料处理标准(FIPS),随后在国际上广泛流传开来.现在DE

java中封装的实现方法详解

1.封装是什么?以及为什么要进行封装? 通常情况下可以给成员变量赋值一些合法但不合理的数值,这种情况在编译阶段和运行阶段都不会报错或给出任何的提示信息,此数值虽然合法但与现实生活不符:为了避免上述问题的发生,就需要对成员变量进行密封包装处理来保证该成员变量的合法合理性,这种机制就叫做封装.封装可以被认为是一个保护屏障,防止该类的代码和数据被外部类定义的代码随机访问.要访问该类的代码和数据,必须通过严格的接口控制. 2.如何进行封装? (1)私有化成员变量,使用private关键字修饰: (2)提

Java中ArrayList的工作原理详解

1.ArrayList 以数组实现.节约空间,但数组有容量限制.超出限制时会增加50%容量,用System.arraycopy()复制到新的数组.因此最好能给出数组大小的预估值.默认第一次插入元素时创建大小为10的数组.按数组下标访问元素-get(i).set(i,e)的性能很高,这是数组的基本优势.如果按下标插入元素.删除元素-add(i,e).remove(i).remove(e),则要用System.arraycopy()来复制移动部分受影响的元素,性能就变差了.越是前面的元素,修改时要移