1、简介
Java在java.math包中提供的API类BigDecimal,用来对超过16位有效位的数进行精确的运算。双精度浮点型变量double可以处理16位有效数。在实际应用中,需要对更大或者更小的数进行运算和处理。float和double只能用来做科学计算或者是工程计算,在商业计算中要用java.math.BigDecimal(原因见下文)。BigDecimal所创建的是对象,我们不能使用传统的+、-、*、/等算术运算符直接对其对象进行数学运算,而必须调用其相对应的方法。方法中的参数也必须是BigDecimal的对象。构造器是类的特殊方法,专门用来创建对象,特别是带有参数的对象。
2、基本使用
2.0 头文件导入
import java.math.BigDecimal;
2.1 Bigdecimal的初始化
- 构造器描述
BigDecimal(int) //创建一个具有参数所指定整数值的对象。
BigDecimal(double) //创建一个具有参数所指定双精度值的对象。 //不推荐使用
BigDecimal(long) //创建一个具有参数所指定长整数值的对象。
BigDecimal(String) //创建一个具有参数所指定以字符串表示的数值的对象。//推荐使用
- 示例
BigDecimal num3 = new BigDecimal(100);
BigDecimal num2 = new BigDecimal(10L);
BigDecimal num1 = new BigDecimal(0.005);//不推荐BigDecimal(double)
//尽量用字符串的形式初始化
BigDecimal num12 = new BigDecimal("0.005");
BigDecimal num22 = new BigDecimal("10000");
BigDecimal num32 = new BigDecimal("-1000");
为什么BigDecimal(double)不推荐使用+在商业计算中要用java.math.BigDecimal
- 示例代码
import java.math.BigDecimal;
public class Solution {
public static void main(String[] args){
BigDecimal doubleStr = new BigDecimal(1.11111111);
System.out.println(doubleStr);
}
}
- 运行结果
C:\Users\itrb\Desktop\java>javac Solution.java
C:\Users\itrb\Desktop\java>java Solution
1.111111109999999957409499984350986778736114501953125
分析
- 根本原因是:十进制值通常没有完全相同的二进制表示形式;十进制数的二进制表示形式可能不精确。只能无限接近于那个值
- 但是,在项目中,我们不可能让这种情况出现,特别是金融项目,因为涉及金额的计算都必须十分精确,你想想,如果你的支付宝账户余额显示193.99999999999998,那是一种怎么样的体验?
- 这也是在商业计算中要用java.math.BigDecimal的原因
2.2 BigDecimal转回基本类型
- API
toString() //将BigDecimal对象的数值转换成字符串。
doubleValue() //将BigDecimal对象中的值以双精度数返回。
floatValue() //将BigDecimal对象中的值以单精度数返回。
longValue() //将BigDecimal对象中的值以长整数返回。
intValue() //将BigDecimal对象中的值以整数返回。
2.3 Bigdecimal的基本运算
- API
add(BigDecimal) //BigDecimal对象中的值相加,然后返回这个对象。
subtract(BigDecimal) //BigDecimal对象中的值相减,然后返回这个对象。
multiply(BigDecimal) //BigDecimal对象中的值相乘,然后返回这个对象。
divide(BigDecimal) //BigDecimal对象中的值相除,然后返回这个对象。
- 示例
//加法
BigDecimal result1 = num1.add(num2);
BigDecimal result12 = num12.add(num22);
//减法
BigDecimal result2 = num1.subtract(num2);
BigDecimal result22 = num12.subtract(num22);
//乘法
BigDecimal result3 = num1.multiply(num2);
BigDecimal result32 = num12.multiply(num22);
//绝对值
BigDecimal result4 = num3.abs();
BigDecimal result42 = num32.abs();
//除法
BigDecimal result5 = num2.divide(num1,20,BigDecimal.ROUND_HALF_UP);
BigDecimal result52 = num22.divide(num12,20,BigDecimal.ROUND_HALF_UP);
备注
- 如果进行除法运算的时候,结果不能整除,有余数,这个时候会报java.lang.ArithmeticException:
这边要避免这个错误产生,在进行除法运算的时候,针对可能出现的小数产生的计算,必须要多传两个参数
- divide(BigDecimal,保留小数点后几位小数,舍入模式)
- 舍入模式
ROUND_CEILING //向正无穷方向舍入
ROUND_DOWN //向零方向舍入
ROUND_FLOOR //向负无穷方向舍入
ROUND_HALF_DOWN //向(距离)最近的一边舍入,除非两边(的距离)是相等,如果是这样,向下舍入, 例如1.55 保留一位小数结果为1.5
ROUND_HALF_EVEN //向(距离)最近的一边舍入,除非两边(的距离)是相等,如果是这样,如果保留位数是奇数,使用ROUND_HALF_UP,如果是偶数,使用ROUND_HALF_DOWN
ROUND_HALF_UP //向(距离)最近的一边舍入,除非两边(的距离)是相等,如果是这样,向上舍入, 1.55保留一位小数结果为1.6,也就是我们常说的“四舍五入”
ROUND_UNNECESSARY //计算结果是精确的,不需要舍入模式
ROUND_UP //向远离0的方向舍入
- 需要对BigDecimal进行截断和四舍五入可用setScale方法
import java.math.BigDecimal;
public class Solution {
public static void main(String[] args){
BigDecimal a = new BigDecimal("2.3366");
a = a.setScale(2,BigDecimal.ROUND_HALF_UP); //保留2位有效数字,且四舍五入
System.out.println(a);
}
}
C:\Users\itrb\Desktop\java
λ javac Solution.java
C:\Users\itrb\Desktop\java
λ java Solution
2.34
2.3 BigDecimal 比较大小
BigDecimal a = new BigDecimal (101);
BigDecimal b = new BigDecimal (111);
//使用compareTo方法比较
//注意:a、b均不能为null,否则会报空指针
if(a.compareTo(b) == -1){
System.out.println("a小于b");
}
if(a.compareTo(b) == 0){
System.out.println("a等于b");
}
if(a.compareTo(b) == 1){
System.out.println("a大于b");
}
if(a.compareTo(b) > -1){
System.out.println("a大于等于b");
}
if(a.compareTo(b) < 1){
System.out.println("a小于等于b");
}
评论 (0)