BigDecimal类
引入
- 思考:以下程序输出结果是多少
public class TestBigDecimal{
public static void main(String[] args){
double d1=1.0;
double d2=0.9;
System.out.println(d1-d2);//为什么不是0.1
double result=(1.4-0.5)/0.9;
System.out.println(result);//为什么不是1
}
}
输出结果为
0.09999999999999998
0.9999999999999999
很多实际应用中需要精确运算,而double是近似值存储,不再符合要求,需要借助BigDecimal
基本概念
- 位置:java.math包中
- 作用:精确计算浮点数
- 创建方式:BigDecimal bd=new BigDecimal(“1.0”); //括号里一定要给一个字符串
package com.commonClass.bigDecimalClass;
import java.math.BigDecimal;
public class Demo01 {
public static void main(String[] args) {
double d1 = 1.0;
double d2 = 0.9;//double类型采用的是近似值存储方式,看着是1,实际上存的是0.999999999999999999999999……,看着是0.9,实际存的是0.899999999999……
System.out.println(d1 - d2);//为什么不是0.1
double result=(1.4-0.5)/0.9;
System.out.println(result);//为什么不是1
//BigDecimal,大的浮点数的精确计算
BigDecimal bd1 = new BigDecimal("1.0");
BigDecimal bd2 = new BigDecimal("0.9");
BigDecimal r1=bd1.subtract(bd2);//这不是数字间的基本运算,所以要实现减法需要调用方法。subtract就可以实现BigDecimal之间的减法运算
System.out.println(r1);
}
}
输出结果为
0.09999999999999998
0.9999999999999999
0.1
还有其他运算符的例子如下
package com.commonClass.bigDecimalClass;
import java.math.BigDecimal;
public class Demo01 {
public static void main(String[] args) {
double d1 = 1.0;
double d2 = 0.9;//double类型采用的是近似值存储方式,看着是1,实际上存的是0.999999999999999999999999……,看着是0.9,实际存的是0.899999999999……
System.out.println(d1 - d2);//为什么不是0.1
System.out.println(d1+d2);
System.out.println(d1*d2);
double result=(1.4-0.5)/0.9;
System.out.println(result);//为什么不是1
//BigDecimal,大的浮点数的精确计算
BigDecimal bd1 = new BigDecimal("1.0");
BigDecimal bd2 = new BigDecimal("0.9");
//减法
BigDecimal r1=bd1.subtract(bd2);//这不是数字间的基本运算,所以要实现减法需要调用方法。subtract就可以实现BigDecimal之间的减法运算
System.out.println(r1);
//加法
BigDecimal r2=bd1.add(bd2);
System.out.println(r2);
//乘法
BigDecimal r3=bd1.multiply(bd2);
System.out.println(r3);
//除法
BigDecimal r4=new BigDecimal("1.4").
subtract(new BigDecimal("0.5")).
divide(new BigDecimal("0.9"));//可以连着写,但是影响阅读,所以隔开能更清晰一些
System.out.println(r4);
//BigDecimal r5=new BigDecimal("20").divide(new BigDecimal("3")); // 20/3除不尽,同时也没告诉他保留几位小数,于是就会抛出异常
BigDecimal r5=new BigDecimal("20").divide(new BigDecimal("3"),2,BigDecimal.ROUND_HALF_UP);//后面的代表保留2位小数,并遵循四舍五入
System.out.println(r5);
}
}
输出结果为
0.09999999999999998
1.9
0.9
0.9999999999999999
0.1
1.9
0.90
1
6.67
- 方法
- BigDecimal add(BigDecimal bd) 加
- BigDecimal subtract(BigDecimal bd) 减
- BigDecimal multiply(BigDecimal bd) 乘
- BigDecimal divide(BigDecimal bd) 除