Java工具类——数学相关类在上一篇文章中,我们系统地学习了Java中的封装类,那么在这篇文章中,我们就来了解一下Goodclasses——数学相关类。1.数学入门当我们最初学习Java的基本语法结构时,实际上是在学习和理解加减乘除等算术运算符。有了这些操作符,我们可以做一些简单的操作,但是当我们需要做一些复杂的计算时,就很难使用这些操作符了(比如获取随机数等)。其实,数学对我们来说并不陌生。在学习Java基础的时候,一定用过Math类。这其实是我们最早接触的数学课之一。其实和数学相关的还有BigInteger和BigDecimal类。等等,下表对这三个类做一个小总结:数学类的包继承关系属于Math类java.lang包,不需要导入。该包继承自Number类并实现了Serializable和Comparable接口。需要引导BigDecimal类java.math包。该包继承自Number类并实现了Serializable和Comparable接口。接下来,我们将详细研究这三种类型。2.Math类其实看源码可以看到Math类是final修饰的,也就是说不能继承子类,只能使用这个类。publicfinalclassMath{}接下来我们仔细看一下Math类1、Math类的构造方法通过查看源码可以知道Math类的构造方法是private的,即不能创建对象,为什么?这样设计其实是因为Math类中的属性和方法是静态的(静态修饰)。/***不要让任何人实例化这个类。*/privateMath(){}2.Math类常用的abs()方法返回给定数的绝对值。该方法提供了4种不同的参数类型重载方法(int,long,float,double)intabs1=Math.abs(-1);长abs2=Math.abs(-3l);浮动abs3=Math.abs(-1.2f);doubleabs4=Math.abs(-3.923);System.out.println(abs1);System.out.println(abs2);System.out.println(abs3);System.out.println(abs4);ceil()方法返回大于等于参数且等于数学整数的最小双精度值,可以理解为向上取整。System.out.println(Math.ceil(-1.3));//-1.0System.out.println(Math.ceil(1.9));//2.0System.out.println(Math.ceil(-7.9));//-7.0System.out.println(Math.ceil(123));//123.0floor()方法返回小于等于参数且等于数学整数的最大双精度值,可以理解向下舍入。System.out.println(Math.floor(-1.3));//-2.0System.out.println(Math.floor(1.9));//1.0System.out.println(Math.floor(1.3));//1.0System.out.println(Math.floor(-7.9));//-8.0System.out.println(Math.floor(123));//123.0round()方法返回最接近参数的整数四舍五入为正无穷大的类型编号实际上是四舍五入的整数。System.out.println(Math.round(-1.3));//-1System.out.println(Math.round(1.9));//2System.out.println(Math.round(1.3));//1System.out.println(Math.round(-7.9));//-8System.out.println(Math.round(123));//123max()方法返回最大值,该方法提供4种不同的参数类型重载方法(int,long,float,double)System.out.println(Math.max(1,3));//3System.out.println(Math.max(-4,-5));//-4System.out.println(Math.max(1.8,1.92));//1.92System.out.println(Math.max(-4f,-4f));//-4.0min(a,b)方法返回最小值,该方法提供了4种不同参数类型(int、long、float、double)的重载方法System.out.println(Math.min(1,3));//1System.out.println(Math.min(-4,-5));//-5System.out.println(Math.min(1.8,1.92));//1.8System.out.println(Math.min(-4f,-4f));//-4.0pow(a,b)方法返回a的b次方,其中参数和返回值都是double类型System.out.println(Math.pow(3,3));//27.0System.out.println(Math.pow(3.2,5));//335.5443200000001random()方法生成一个double类型的随机数,范围是[0.0,1.0),注意是左闭右开。System.out.println(Math.random());//0.4128879706448445System.out.println(Math.random());//0.9024029619163387System.out.println(Math.random());//0.4265563513755902我们都知道BigInteger类。在基本数据类型中,long类型的取值范围最大,即8个字节。取值范围是-2的63次方到正2的63次方到负1的63次方。当然这个取值范围很大。在平时的开发中,我们只使用int类型,基本够用了,但是当我们存储的数据长度超过了long类型的长度时,怎么办呢?存储呢?这时候BigInteger类就可以解决我们的问题了。顾名思义,BigInteger其实叫做大整数,也就是说它只能存储整数。我们通过构造方法和常用方法来理解BigInteger类。1.构造方法BigInteger类有8个构造方法,其中私有构造方法2个。8个构造方法分别是:privateBigInteger(int[]val){}privateBigInteger(intsignum,int[]magnitude){}publicBigInteger(byte[]val){}publicBigInteger(Stringval){}publicBigInteger(Stringval,intradix){}publicBigInteger(intsignum,byte[]magnitude){}publicBigInteger(intnumBits,Randomrnd){}publicBigInteger(intbitLength,intcertainty,Randomrnd){}2.常用类网上用过的方法当我们要用这个类做四项算术运算时,是不是也可以直接做加减乘除,如下图:通过上图,直接做四项显然是不行的BigInteger类的算术运算。因为上面两个数字都是引用类型,运算符只能对基本数据类型进行操作。那么对应的四项算术运算我们如何进行呢?其实BigInteger类已经帮我们实现了相应的方法,我们可以直接用实例化的对象来调用它。例如,下面的代码执行加减乘除:privatestaticvoidtest6(){BigIntegernum1=newBigInteger("1111");BigIntegernum2=newBigInteger("2222");//加法BigIntegeradd=num1.add(num2);//减法BigIntegersubtract=num2.subtract(num1);//乘法finalBigIntegermultiply=num1.multiply(num2);//除法(圆)BigIntegerdivide=num2.divide(num1);//除法(拿我)BigIntegermod=num2.mod(num1);System.out.println(add);//3333System.out.println(subtract);//1111System.out.println(multiply);//2468642System.out.println(divide);//2System.out.println(mod);//0}四、BigDecimal类和BigInteger类对应BigDecimal类。BigInteger处理整数,而BigDecimal处理小数。Decimal英文单词是小数的意思,所以BigDecimal顾名思义就是大数小数,处理大的小数。如果一个decimal超出了double类型的取值范围,就需要使用BigDecimal。1.构造方法BigDecimal类的构造方法有很多,最常用的有以下四种:值){}2。类中常用的方法与BigInteger类相同。BigDecimal不能直接加减乘除。){BigDecimalnum1=newBigDecimal("1.23");BigDecimalnum2=newBigDecimal("2.46");//加法BigDecimaladd=num1.add(num2);//减法BigDecimalsubtract=num2.subtract(num1);//乘法finalBigDecimalmultiply=num1.multiply(num2);//除法(四舍五入)BigDecimaldivide=num2.divide(num1);System.out.println(add);//3.69System.out.println(subtract);//1.23System.out.println(multiply);//3.0258System.out.println(divide);//2}Due针对小数和整数的区别,小数往往涉及精度问题,所以BigDecimal也提供了三种设置小数精度的方法:intnewScale,RoundingModeroundingMode)这三个方法首先第一个参数是设置小数点后的位数,第二个参数是设置方式(如向上或向下舍入等),共有8种舍入方式:publicfinalstaticintROUND_UP=0;publicfinalstaticintROUND_DOWN=1;publicfinalstaticintROUND_CEILING=2;publicfinalstaticintROUND_FLOOR=3;publicfinalstaticintROUND_HALF_UP=4;publicfinalstaticintROUND_HALF_DOWN=5;publicfinalstaticintROUND_HALF_EVEN=6;publicfinalstaticintROUND_UNNECESSARY=7;下面就对这4种模式的用法做一个详细的分析。ROUND_UP模式UP的意思是向上,可以理解为加法的意思。比如我保留三位小数,那我不管你后面的小数是多少(0除外),我都会给你加一,相当于四舍五入。例如,在下面的代码中,我保留了3作为小数,模式设置为ROUND_UP模式。如果最后一位为0,则结果为9.461,否则为9.462BigDecimalbigDecimal=newBigDecimal("9.4610");BigDecimalresult=bigDecimal.setScale(3,BigDecimal.ROUND_UP);ROUND_DOWN模式是一个截断的概念。比如我保留三位小数,不管你后面的小数是多少,我都不四舍五入。会被硬生生截断,这是相当的原因,我小数点后取三位,三位后不要任何东西。比如下面的代码,我把3保留为小数,模式设置为ROUND_DOWN模式,所以无论最后一位是什么(从0到9),最后的结果都是9.461BigDecimalbigDecimal=newBigDecimal("9.4611");BigDecimal结果=bigDecimal.setScale(3,BigDecimal.ROUND_DOWN);ROUND_CEILING模式这种模式是,如果给定的数字是正数,则行为与ROUND_UP相同,如果是负数,则行为与ROUND_DOWN相同。ROUND_FLOOR模式这种模式是如果给定的数字是正数,行为和ROUND_DOWN一样,如果是负数,行为和ROUND_UP一样5.总结以上是我对数学相关课程的总结和个人理解。有什么不明白的可以去看官方文档(API官方文档地址:https://docs.oracle.com/javas...),其实很多人都非常排斥看源码和阅读官网文档,原因是源码和阅读官网文档都是英文的,需要花很多时间去解读;事实上,这是一种糟糕的学习方式。源码和阅读官网文档是最官方最权威的第一手资料,也是最正确的。如果我们去网上看其他相关的解读,这只能是别人的解读,而别人的解读代表了他个人对源码和阅读官网文档的理解,而这个理解可能会有所不同,即,可能会误导我们,所以我们一定要养成阅读源码和官网文档的习惯,一开始可能真的很慢,但是慢慢你的阅读速度和效率就会提高。最后,最近有很多朋友找我要一份Linux学习路线图,所以我结合自己的经验,利用业余时间熬夜一个月,整理了一本电子书。无论你是面试还是自我提升,相信都会对你有所帮助!免费送给大家,只求大家给我点个赞!电子书|LinuxDevelopmentLearningRoadmap也希望有小伙伴可以加入我的行列,把这本电子书做得更加完美!获得?希望老铁们来个三连击,让更多人看到这篇文章。推荐阅读:干货|程序员和高级架构师免费发送工件的必备资源|支持搜索的资源网站
