八大基本数据类型
https://www.jianshu.com/p/a1188413bf9a
扩展数字类型
基本的数字类型可以直接通过+、-、*、/进行数学计算,但大整数和大浮点数需要调用对应的实例方法完成数学计算:
- [x] 加 add()
- [x] 减 subtract()
- [x] 乘 multiply()
- [x] 除 divide()
大整数 java.math.BigInteger
在 Java 中,由 CPU 原生提供的整型最大范围是 64 位 long 型整数。使用 long 型整数可以直接通过CPU指令进行计算,速度非常快。
如果我们使用的整数范围超过了 long 型怎么办?这个时候,就只能用软件来模拟一个大整数。java.math.BigInteger 就是用来表示任意大小的整数。BigInteger 内部用一个 int[] 数组来模拟一个非常大的整数。
BigInteger 支持任意精度的整数,也就是说在运算中 BigInteger 类型可以准确地表示任何大小的整数值而不会丢失任何信息。和 long 型整数运算比,BigInteger 不会有范围限制,但缺点是速度比较慢。
使用BigInteger 类,可以实例化一个BigInteger 对象,并选择调用相应的构造函数。BigInteger 类具有很多构造函数,但最直接的一种方式是参数以字符串形式代表要处理的数字。
在 BigInteger 类中封装了多种操作!除了基本的加、减、乘、除操作之外,还提供了绝对值、相反数、最大公约数以及判断是否为质数等操作。
比较 BigInteger 对象是否相等,可以使用 equals() 方法,也可以使用 compareTo() 方法,它根据两个值的大小分别返回负数、正数和0,分别表示小于、大于和等于。
BigInteger 是不可变的;四则运算后要使用对象保存结果,否则运算结果就会丢失。
大浮点数 java.math.BigDecimal
和BigInteger类似,BigDecimal可以表示一个任意大小且精度完全准确的浮点数。
BigDecimal类的标度使用scale属性表示,就是小数位数,精度使用precision属性表示,就是有效位数(亦即整数位+小数位),例如:
BigDecimal d1 = new BigDecimal("123.45");
System.out.println(d1.scale()); // 2位小数
BigDecimal d2 = new BigDecimal("123.4500");
System.out.println(d2.scale()); // 4位小数
BigDecimal d3 = new BigDecimal("1234500");
System.out.println(d3.scale()); // 0位小数
BigDecimal n1 = new BigDecimal("3.1415926");
System.out.println(n1.scale()); // 7位小数
System.out.println(n1.precision()); // 8位有效位数
比较 BigDecimal 的值是否相等,必须使用 compareTo() 方法来比较,它根据两个值的大小分别返回负数、正数和0,分别表示小于、大于和等于,而不能使用 equals() 。
BigDecimal 是不可变的;四则运算后要使用对象保存结果,否则运算结果就会丢失。
对 BigDecimal 做加、减、乘运算时,精度不会丢失,但是做除法时,存在无法除尽的情况,就必须指定精度以及如何进行截断,也就是需要使用舍入模式 RoundingMode ,否则会遇到 ArithmeticException 异常
public BigDecimal divide(BigDecimal divisor) {
……
}
public BigDecimal divide(BigDecimal divisor, RoundingMode roundingMode){
……
}
RoundingMode枚举值如下:
枚举 | 说明 |
---|---|
CEILING | 向正无限大方向舍入的舍入模式 |
DOWN | 向零方向舍入的舍入模式 |
FLOOR | 向负无限大方向舍入的舍入模式 |
HALF_DOWN | 向最接近数字方向舍入的舍入模式,如果与两个相邻数字的距离相等,则向下舍入 |
HALF_EVEN | 向最接近数字方向舍入的舍入模式,如果与两个相邻数字的距离相等,则向相邻的偶数舍入 |
HALF_UP | 向最接近数字方向舍入的舍入模式,如果与两个相邻数字的距离相等,则向上舍入 |
UNNECESSARY | 用于断言请求的操作具有精确结果的舍入模式,因此不需要舍入 |
UP | 远离零方向舍入的舍入模式 |
参考资料
BigInteger —— 廖雪峰
https://www.liaoxuefeng.com/wiki/1252599548343744/1279767986831393
Java大数字运算之BigInteger 原创
https://www.jb51.net/article/122354.htm
DecimalFormat对数值格式化的舍入问题 —— RoundingMode
https://blog.csdn.net/alanzyy/article/details/8465098
Java中BigDecimal在金融行业中的使用
https://www.cnblogs.com/Anidot/p/7724160.html