在上一篇文章中,咱们系统学习了 Java 里面的包装类,那么这篇文章,咱们就来学习一下Java提供好的类——数学相关的类。java
在最先期学习 Java 基础语法结构的时候,其实咱们学习并了解了加减乘除这些算数运算符,有了这些运算符,咱们就能够作一些简单的运算了,可是当咱们须要作一些比较复杂的运算的时候,其实用这些运算符是很难去处理的(好比获取随机数等等)。其实数学类对于咱们并不陌生,在学习 Java 基础的时候,你必定用过 Math 类的,这个其实就是咱们最先期接触的一个数学类了,其实与数学相关的类还有 BigInteger 类、BigDecimal 类等等,下面这个表格将这三个类作了一个小的梳理总结:程序员
数学类 | 所属包 | 继承关系 |
---|---|---|
Math类 | java.lang包,不须要导包 | 默认继承Object基类 |
BigInteger类 | java.math包,须要导包 | 继承自Number类,实现了Serializable, Comparable接口 |
BigDecimal类 | java.math包,须要导包 | 继承自Number类,实现了Serializable, Comparable接口 |
下面咱们就对这三种类作一个详细的学习。面试
其实看源码咱们看到,Math 这个类是 final 修饰的,意思就是不能让子类去继承的,只能使用这个类。api
public final class Math {}复制代码
下面,咱们来详细了解一下Math类架构
经过看源码,咱们能够得知 Math 这个类的构造方法是私有的,也就是咱们是不能建立对象的,为何会这样设计呢,实际上是由于 Math 类里面的属性和方法都是静态的( static 修饰)。oracle
/**
* Don't let anyone instantiate this class.
*/
private Math() {}复制代码
int abs1 = Math.abs(-1);
long abs2 = Math.abs(-3l);
float abs3 = Math.abs(-1.2f);
double abs4 = Math.abs(-3.923);
System.out.println(abs1);
System.out.println(abs2);
System.out.println(abs3);
System.out.println(abs4);复制代码
System.out.println(Math.ceil(-1.3));//-1.0
System.out.println(Math.ceil(1.9));//2.0
System.out.println(Math.ceil(-7.9));//-7.0
System.out.println(Math.ceil(123));//123.0复制代码
System.out.println(Math.floor(-1.3));//-2.0
System.out.println(Math.floor(1.9));//1.0
System.out.println(Math.floor(1.3));//1.0
System.out.println(Math.floor(-7.9));//-8.0
System.out.println(Math.floor(123));//123.0复制代码
System.out.println(Math.round(-1.3));//-1
System.out.println(Math.round(1.9));//2
System.out.println(Math.round(1.3));//1
System.out.println(Math.round(-7.9));//-8
System.out.println(Math.round(123));//123复制代码
System.out.println(Math.max(1, 3));//3
System.out.println(Math.max(-4, -5));//-4
System.out.println(Math.max(1.8, 1.92));//1.92
System.out.println(Math.max(-4f, -4f));//-4.0复制代码
System.out.println(Math.min(1, 3));//1
System.out.println(Math.min(-4, -5));//-5
System.out.println(Math.min(1.8, 1.92));//1.8
System.out.println(Math.min(-4f, -4f));//-4.0复制代码
System.out.println(Math.pow(3, 3));//27.0
System.out.println(Math.pow(3.2, 5));//335.5443200000001复制代码
System.out.println(Math.random());//0.4128879706448445
System.out.println(Math.random());//0.9024029619163387
System.out.println(Math.random());//0.4265563513755902复制代码
咱们都知道,在基本数据类型里面,long型的取值范围是最大的,也就是8个字节,取值范围是-2的63次方到正的2的63次方减去1,固然,这个取值范围很大很大,在平时的开发中,咱们其中只用到int类型的都基本够了,可是当咱们存储的数据的长度超过了 long 型的长度时,咱们该怎么存储呢?这时候,BigInteger 类就能够解决咱们的问题。dom
BigInteger 顾名思义,其实就是叫大整数,也就是说只能存储整型的数,咱们经过构造方法和经常使用方法来了解BigInteger 类。ide
BigInteger 类有8个构造方法,其中有2个私有构造方法。8个构造方法分别是:工具
private BigInteger(int[] val){}复制代码
private BigInteger(int signum, int[] magnitude){}复制代码
public BigInteger(byte[] val){}复制代码
public BigInteger(String val){}复制代码
public BigInteger(String val, int radix) {}复制代码
public BigInteger(int signum, byte[] magnitude){}复制代码
public BigInteger(int numBits, Random rnd){}复制代码
public BigInteger(int bitLength, int certainty, Random rnd){}复制代码
当咱们想用这个类作四则运算的时候,是否是也能够直接加减乘除呢,好比下面这张图:学习
经过上面这张图,BigInteger类直接作四则运算显然是不能够的,由于上面两个数是引用类型,而运算符只能对基本数据类型作运算。那么咱们怎么作相应的四则运算呢?其实BigInteger类里面其实已经帮咱们实现对应的方法,咱们直接用实例化的的对象调用它就好了。好比下方的代码进行加减乘除:
private static void test6() {
BigInteger num1 = new BigInteger("1111");
BigInteger num2 = new BigInteger("2222");
//加法
BigInteger add = num1.add(num2);
//减法
BigInteger subtract = num2.subtract(num1);
//乘法
final BigInteger multiply = num1.multiply(num2);
//除法(取整)
BigInteger divide = num2.divide(num1);
//除法(取余)
BigInteger mod = num2.mod(num1);
System.out.println(add);//3333
System.out.println(subtract);//1111
System.out.println(multiply);//2468642
System.out.println(divide);//2
System.out.println(mod);//0
}复制代码
与 BigInteger 类对应的是 BigDecimal 类,BigInteger 是处理整数的,而 BigDecimal 是处理小数的,Decimal 英文单词就是小数的意思,因此 BigDecimal 顾名思义就是大小数,处理大的小数的。若是一个小数超过了 double类型的取值范围,就须要用到 BigDecimal。
BigDecimal 类的构造方法有不少,最经常使用的是如下四个:
public BigDecimal(double val) {复制代码
public BigDecimal(int val) {}复制代码
public BigDecimal(String val) {}复制代码
public BigDecimal(long val) {}复制代码
和 BigInteger 类同样,BigDecimal 也是不能够直接进行加减乘除的,加减乘除的方式和 BigInteger 处理方式同样,好比下面的代码对BigDecimal 进行四则运算:
private static void test7() {
BigDecimal num1 = new BigDecimal("1.23");
BigDecimal num2 = new BigDecimal("2.46");
//加法
BigDecimal add = num1.add(num2);
//减法
BigDecimal subtract = num2.subtract(num1);
//乘法
final BigDecimal multiply = num1.multiply(num2);
//除法(取整)
BigDecimal divide = num2.divide(num1);
System.out.println(add);//3.69
System.out.println(subtract);//1.23
System.out.println(multiply);//3.0258
System.out.println(divide);//2
}复制代码
因为小数和整数不同,小数常常涉及到精度的问题,因此 BigDecimal 里面也提供了方法来设置小数的精度,设置精度的方法有三个重载的方法:
public BigDecimal setScale(int newScale)复制代码
public BigDecimal setScale(int newScale, int roundingMode)复制代码
public BigDecimal setScale(int newScale, RoundingMode roundingMode)复制代码
这三个方法的第一个参数是设置保留小数点以后的位数,第二个参数是设置的模式(好比向上取整仍是向下取整等等),设置四舍五入的模式有8种:
public final static int ROUND_UP = 0;
public final static int ROUND_DOWN = 1;
public final static int ROUND_CEILING = 2;
public final static int ROUND_FLOOR = 3;
public final static int ROUND_HALF_UP = 4;
public final static int ROUND_HALF_DOWN = 5;
public final static int ROUND_HALF_EVEN = 6;
public final static int ROUND_UNNECESSARY = 7;复制代码
下面咱们就来对这其中4种模式的用法作一个详细的分析
UP的意思就是向上的意思,能够理解为加的意思。好比我保留了三位小数,那么我无论你后面的小数值如何(除了0),我都给你加一,就至关于四舍五入的五入。好比下面这个代码,我保留3为小数,模式设置为ROUND_UP模式,那么若是最后一位是0,那么结果就是9.461,不然就是9.462
BigDecimal bigDecimal = new BigDecimal("9.4610");
BigDecimal result = bigDecimal.setScale(3, BigDecimal.ROUND_UP);复制代码
是一个舍位取值的概念,好比我保留了三位小数,那么我无论你后面的小数值如何,也不会四舍五入,就硬生生的的截断,至关于什么呢,就是我从小数点后面开始取三位,三位后面的都不要了。好比下面这个代码,我保留3为小数,模式设置为ROUND_DOWN模式,那么最后一位不论是什么(从0到9),最后的结果都是9.461
BigDecimal bigDecimal = new BigDecimal("9.4611");
BigDecimal result = bigDecimal.setScale(3, BigDecimal.ROUND_DOWN);复制代码
这个模式就是给定的数若是为正数,行为和ROUND_UP同样,若是为负数,行为和ROUND_DOWN同样 。
这个模式就是给定的数若是为正数,行为和ROUND_DOWN同样,若是为负数,行为和ROUND_UP同样
以上就是我对数学相关类的总结以及我的的理解,若是有任何不清楚的,能够去看官方文档(API官方文档地址:docs.oracle.com/javase/8/do…
最后,最近不少小伙伴找我要Linux学习路线图,因而我根据本身的经验,利用业余时间熬夜肝了一个月,整理了一份电子书。不管你是面试仍是自我提高,相信都会对你有帮助!目录以下:
免费送给你们,只求你们金指给我点个赞!
也但愿有小伙伴能加入我,把这份电子书作得更完美!
推荐阅读: