Java工具类——数学相关的类
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类
其实看源码我们看到,Math 这个类是 final 修饰的,意思就是不能让子类去继承的,只能使用这个类。
public final class Math {}
下面,我们来详细了解一下Math类
1、Math类构造方法
通过看源码,我们可以得知 Math 这个类的构造方法是私有的,也就是我们是不能创建对象的,为什么会这样设计呢,其实是因为 Math 类里面的属性和方法都是静态的( static 修饰)。
/**
* Don't let anyone instantiate this class.
*/
private Math() {}
2、Math类常用的方法
- abs()方法返回给定数的绝对值,方法提供了4个不同参数类型重载方法(int, long, float, double)
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);
- ceil()方法返回大于或等于参数且等于一个数学整数的最小的双精度值,可以理解为向上取整。
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
- floor()方法返回最大的双精度值,该双精度值小于或等于参数,并且等于一个数学整数,可以理解为向下取整。
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
- round()方法返回与参数最接近的整型数,四舍五入为正无穷,其实就是四舍五入的整数。
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
- max()方法返回最大值,该方法提供了4个不同参数类型重载方法(int,long,float,double)
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
- min(a, b)方法返回最小值,该方法提供了4个不同参数类型重载方法(int, long, float, double)
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
- pow(a, b)方法返回 a 的 b 次方,其中参数和返回值都是 double 类型的
System.out.println(Math.pow(3, 3));//27.0
System.out.println(Math.pow(3.2, 5));//335.5443200000001
- random()方法生成一个 double 类型的随机数,范围是[ 0.0, 1.0),注意是左闭右开。
System.out.println(Math.random());//0.4128879706448445
System.out.println(Math.random());//0.9024029619163387
System.out.println(Math.random());//0.4265563513755902
三、BigInteger类
我们都知道,在基本数据类型里面,long型的取值范围是最大的,也就是8个字节,取值范围是-2的63次方到正的2的63次方减去1,当然,这个取值范围很大很大,在平时的开发中,我们其中只用到int类型的都基本够了,但是当我们存储的数据的长度超过了 long 型的长度时,我们该怎么存储呢?这时候,BigInteger 类就可以解决我们的问题。
BigInteger 顾名思义,其实就是叫大整数,也就是说只能存储整型的数,我们通过构造方法和常用方法来了解BigInteger 类。
1、构造方法
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){}
2、类中常用的方法
当我们想用这个类做四则运算的时候,是不是也可以直接加减乘除呢,比如下面这张图:
通过上面这张图,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
}
四、BigDecimal类
与 BigInteger 类对应的是 BigDecimal 类,BigInteger 是处理整数的,而 BigDecimal 是处理小数的,Decimal 英文单词就是小数的意思,所以 BigDecimal 顾名思义就是大小数,处理大的小数的。如果一个小数超过了 double类型的取值范围,就需要用到 BigDecimal。
1、构造方法
BigDecimal 类的构造方法有很多,最常用的是以下四个:
public BigDecimal(double val) {
public BigDecimal(int val) {}
public BigDecimal(String val) {}
public BigDecimal(long val) {}
2、类中常用的方法
和 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种模式的用法做一个详细的分析
- ROUND_UP 模式
UP的意思就是向上的意思,可以理解为加的意思。比如我保留了三位小数,那么我不管你后面的小数值如何(除了0),我都给你加一,就相当于四舍五入的五入。比如下面这个代码,我保留3为小数,模式设置为ROUND_UP模式,那么如果最后一位是0,那么结果就是9.461,否则就是9.462
BigDecimal bigDecimal = new BigDecimal("9.4610");
BigDecimal result = bigDecimal.setScale(3, BigDecimal.ROUND_UP);
- ROUND_DOWN 模式
是一个舍位取值的概念,比如我保留了三位小数,那么我不管你后面的小数值如何,也不会四舍五入,就硬生生的的截断,相当于什么呢,就是我从小数点后面开始取三位,三位后面的都不要了。比如下面这个代码,我保留3为小数,模式设置为ROUND_DOWN模式,那么最后一位不管是什么(从0到9),最后的结果都是9.461
BigDecimal bigDecimal = new BigDecimal("9.4611");
BigDecimal result = bigDecimal.setScale(3, BigDecimal.ROUND_DOWN);
- ROUND_CEILING 模式
这个模式就是给定的数如果为正数,行为和ROUND_UP一样,如果为负数,行为和ROUND_DOWN一样 。
- ROUND_FLOOR 模式
这个模式就是给定的数如果为正数,行为和ROUND_DOWN一样,如果为负数,行为和ROUND_UP一样
五、小结
以上就是我对数学相关类的总结以及个人的理解,如果有任何不清楚的,可以去看官方文档(API官方文档地址:https://docs.oracle.com/javase/8/docs/api/),其实,很多人都很排斥看源码和阅读官网文档,原因就是源码和阅读官网文档都是全英文的,解读起来很费时间;其实这是一种不好的学习方式,源码和阅读官网文档是最官方权威的第一手资料,也是最正确的,如果我们去网上看其他的相关解读,这也只能是他人的解读,而其他人的解读就代表了他对源码和阅读官网文档的个人理解,而这个理解是可能会有出入的,也就是可能会误导我们,所以我们一定要养成习惯去阅读源码和阅读官网文档,可能刚开始的确很慢,但是慢慢的就你的阅读速度和效率就会提高的。
公众号:良许Linux
有收获?希望老铁们来个三连击,给更多的人看到这篇文章
Java工具类——数学相关的类的更多相关文章
- Java.util.Math类--数学相关的工具类
Math类--数学相关的工具类 java.util.Math类是数学相关的工具类,里面提供了大量的静态方法,完成与数学运算相关的操作. public static double abs(double ...
- [自用]多项式类数学相关(定理&证明&板子)
写在前面 由于上一篇总结的版面限制,特开此文来记录 \(OI\) 中多项式类数学相关的问题. 该文启发于Miskcoo的博客,甚至一些地方直接引用,在此特别说明:若文章中出现错误,烦请告知. 感谢你的 ...
- [总结]数论和组合计数类数学相关(定理&证明&板子)
0 写在前面 0.0 前言 由于我太菜了,导致一些东西一学就忘,特开此文来记录下最让我头痛的数学相关问题. 一些引用的文字都注释了原文链接,若侵犯了您的权益,敬请告知:若文章中出现错误,也烦请告知. ...
- [总结]多项式类数学相关(定理&证明&板子)
目录 写在前面 前置技能 多项式相关 多项式的系数表示 多项式的点值表示 复数相关 复数的意义 复数的基本运算 单位根 代码相关 多项式乘法 快速傅里叶变换 DFT IDFT 算法实现 递归实现 迭代 ...
- Java工具类——日期相关的类
前言 在日常的开发工作当中,我们经常需要用到日期相关的类(包括日期类已经处理日期的类),所以,我就专门整理了一篇关于日期相关的类,希望可以帮助到大家. 正文 一.日期类介绍 在 Java 里面,操作日 ...
- [自用]数论和组合计数类数学相关(定理&证明&板子)
0 写在前面 本文受 NaVi_Awson 的启发,甚至一些地方直接引用,在此说明. 1 数论 1.0 gcd 1.0.0 gcd $gcd(a,b) = gcd(b,a\;mod\;b)$ 证明:设 ...
- 今天工作中遇到的根据用户id取得产品大类和相关小类的问题
今天做了一个项目,需求是客户登陆后,可以从会员中心发布详细信息(包括联系信息和公司信息),插入到数据库后在将来生成一个公司页面模板,一般的产品大类+小类 用repeater嵌套就可以了,但是这个涉及到 ...
- Java工具类—包装类
Java工具类--包装类 我们都知道,JDK 其实给我们提供了很多很多 Java 开发者已经写好的现成的类,他们其实都可以理解成工具类,比如我们常见的集合类,日期相关的类,数学相关的类等等,有了这些工 ...
- Java工具类之:包装类
Java工具类--包装类 我们都知道,JDK 其实给我们提供了很多很多 Java 开发者已经写好的现成的类,他们其实都可以理解成工具类,比如我们常见的集合类,日期相关的类,数学相关的类等等,有了这些工 ...
随机推荐
- Java实现 蓝桥杯 历届试题 斐波那契
试题 历届试题 斐波那契 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 斐波那契数列大家都非常熟悉.它的定义是: f(x) = 1 - (x=1,2) f(x) = f(x-1) ...
- Java实现 蓝桥杯VIP 算法训练 新生舞会
问题描述 新生舞会开始了.n名新生每人有三个属性:姓名.学号.性别.其中,姓名用长度不超过20的仅由大小写字母构成的字符串表示,学号用长度不超过10的仅由数字构成的字符串表示,性别用一个大写字符'F' ...
- CSDN账号被冻结了怎么办
CSDN可能因为你的博客里有一些网站链接给你判断为恶意推广广告,冻结, 或者和我一样,在评论区刷屏被冻结, 联系客服即可,向客服提供你的绑定邮箱或绑定手机号,或博客id,客服会给你解冻 PS: 找不到 ...
- Java实现微生物增殖
微生物增殖 假设有两种微生物 X 和 Y X出生后每隔3分钟分裂一次(数目加倍),Y出生后每隔2分钟分裂一次(数目加倍). 一个新出生的X,半分钟之后吃掉1个Y,并且,从此开始,每隔1分钟吃1个Y. ...
- Java实现第九届蓝桥杯分数
分数 题目描述 1/1 + 1/2 + 1/4 + 1/8 + 1/16 + - 每项是前一项的一半,如果一共有20项, 求这个和是多少,结果用分数表示出来. 类似: 3/2 当然,这只是加了前2项而 ...
- java实现第五届蓝桥杯扑克序列
扑克序列 AA223344,一共4对扑克牌.请你把它们排成一行. 要求:两个A中间有1张牌,两个2之间有2张牌,两个3之间有3张牌,两个4之间有4张牌. 4A3A2432, 2342A3A4 请填写出 ...
- Spring Data Jpa Specification 调用Oracle 函数/方法
开发框架用的Jpa,数据库是 Oracle. 在开发中难免会遇到需要数据库字段是字符串格式,但是又需要对其进行范围查询(数据库设计问题,后续应避免).那么问题来了, Jpa Specification ...
- HashMap(二)之面试题系列
定义类考题 什么是Hash?什么是HashMap? HashMap 的工作原理是什么 HashMap HashTable的区别 为什么要用HashMap 源码类考题 什么是hash碰撞,怎么减少碰撞, ...
- Docker+Selenium+TestNG+Maven+Jenkins环境搭建
一.Selenium环境准备 standalone-chrome Docker容器启动: docker pull selenium/standalone-chrome version: '3' ser ...
- 如何向这些CA来申请数字证书呢?
申请的过程大致是: 1.自己本地先生成一对密匙,然后拿着自己的公匙以及其他信息(比如说企业名称啊什么的)去CA申请数字证书. 2.CA在拿到这些信息后,会选择一种单向Hash算法(比如说常见的MD5) ...