Day34:BigDecimal的使用

2023-02-20,

BigDecimal

在基本数据类型中对于浮点数的计算时会出现精度丢失的情况,这个时候我们采用BigDecimal类来解决精度丢失的问题。

public class Test{
public static void main(String[] args){
double a=1.0;
double b=0.9;
System.out.println(a-b);
}
}
0.09999999999999998//精度丢失

观察上面代码,我们发现原本应该等于0.1的值却变成了0.09999999999999998,这是因为double类型中存储的值是一个近似值,同样float类型亦是如此,也就是说a中存储的值是无限接近1.0而非真正的1.0,b中存储的值也是无限接近0.9的,所以当整个运算下来出现了精度丢失。

不同的行业领域对数字的精度要求不一样,比如银行对数字的要求非常严格,这也就导致在追求高精度的数值上我们不能使用基本类型的浮点数来运算。

Java中提供了BigDecimal类供我们对高精度数字进行运算。


BigDecimal

位置:java.math包中

作用:精确计算浮点数

创建方式:BigDecimal a=new BigDecimal("1.0"); //构造方法中一定要选用字符串带参构造,否则运算还是会丢失精度

方法:

方法名 功能
public BigDecimal add(BigDecimal b); +
public BigDecimal subtract(BigDecimal b); -
public BigDecimal multiply(BigDecimal b); *
public BigDecimal divide(BigDecimal b); /
public BigDecimal divide(BigDeclimal b, int scal, RoundingMode mode); scal—保留的位数;mode—舍入的模式;四舍五入为BigDecimal.ROUND_HALF_UP
public class Test{
public static void main(String[] args){
BigDecimal b1=new BigDecimal("1.0");//注意这里一定要用字符串的传参才能保证精度不丢失
BigDecimal b2=new BigDecimal("0.9"); //当BigDecimal实例后,我们不能对实例进行加减乘除,应该调用实例的方法进行运算
//subtract(); 减法
BigDecimal c1=b1.subtract(b2);
System.out.println(c1);
//multiply();乘法
System.out.println(b1.multiply(b2));
//add();加法
System.out.println(b1.add(b2));
//divide();除法
System.out.println(new BigDecimal("1.0").divide(new BigDecimal("2.0")));//链式运算
//除法中除不尽的情况下我们要用到divide的重载方法
System.out.println(new BigDecimal("1.0").divide(new BigDecimal("3.0"),2,BigDecimal.ROUND_HALF_UP) );
}
}
0.1
0.90
1.9
0.5
0.33 //保留两位小数且四舍五入

注意:

BigDecimal构造器使用字符串参数,否则精度丢失
BigDecimal实例化后不可再用普通运算符来操作对象的运算,需调用方法进行运算
除法中有除不尽的情况,需要用到divide的重载方法

Day34:BigDecimal的使用的相关教程结束。

《Day34:BigDecimal的使用.doc》

下载本文的Word格式文档,以方便收藏与打印。