BigDecimal
思考:以下程序输出结果是多少?
public class Demo05 {
public static void main(String[] args) {
double d1=1.0;
double d2=0.9;
System.out.println(d1-d2);//0.09999999999999998
double result=(1.4-0.5)/0.9;
System.out.println(result);//0.9999999999999999
}
}
结果不是0.1 也不是1,因为double类型和float类型存储的都是近似值,存的是1.0,实际上可能是0.99999,再经过各种运算,结果就会出现一定的误差,但误差较小。但很多实际应用中需要精确运输,这时要借助BigDecimal
BigDecimal
- 位置:java.math包中
- 作用:精确计算浮点数
- 创建方式:BigDecimal bd=new BigDecimal("1.0");
- 方法:
- 加法:BigDecimal add(BigDecimal bd)
- 减法:BigDecimal subtract(BigDecimal bd)
- 乘法:BigDecimal mutiply(BigDecimal bd)
- 除法:BigDecimal divide(BigDecimal bd)
import java.math.BigDecimal;
public class Demo05 {
public static void main(String[] args) {
double d1=1.0;
double d2=0.9;
System.out.println(d1-d2);//0.09999999999999998
double result=(1.4-0.5)/0.9;
System.out.println(result);//0.9999999999999999
//BigDecimal,大的浮点数的精确计算
BigDecimal bd1=new BigDecimal("1.0");
BigDecimal bd2=new BigDecimal("0.9");
//减法
BigDecimal r1=bd1.subtract(bd2);
System.out.println(r1);//0.1
//加法
BigDecimal r2=bd1.add(bd2);
System.out.println(r2);//1.9
//乘法
BigDecimal r3=bd1.multiply(bd2);
System.out.println(r3);//0.90
//除法
BigDecimal r4=new BigDecimal("1.4")
.subtract(new BigDecimal("0.5"))
.divide(new BigDecimal("0.9"));
System.out.println(r4);//1
BigDecimal r5=new BigDecimal("10")
//scale:指定精确到小数点后几位,BigDecimal.ROUND_HALF_UP:四舍五入
.divide(new BigDecimal("3"),2,BigDecimal.ROUND_HALF_UP);
System.out.println(r5);//3.33 除不尽的时候会报错,需要保留几位小数
}
}