BigDecimal
一、浅析
-
Float和Double都是浮点数,处理数据,会丢失一定的精确度;
Java在java.math包中提供API类BigDecimal,用来对超过16位有效位的数进行精确的运算。
所以开发中,如果我们需要精确计算的结果,则必须使用BigDecimal类来操作。
-
BigDemcimal所创建的是对象,故我们不能使用传统的+、-、*、/等算术运算符直接对其对象进行数学运算,而必须调用其相对应的方法。方法中的参数也必须是BigDecimal的对象。
二、 BigDecimal用法
1、BigDecimal构造方法
-
BigDecimal(double val)
将double表示形式转换为BigDecimal
BigDecimal intBigDecimal = new BigDecimal(2); System.out.println(intBigDecimal);//2
-
BigDecimal(int val)
将int表示形式转换成BigDecimal
BigDecimal doubleBigDecimal = new BigDecimal(0.2); System.out.println(doubleBigDecimal);//0.200000000000000011102230246251565404236316680908203125
- 参数类型为double的构造方法的结果有一定的不可预知性;
- 0.2——–非标度值为2,其标度为2,实际上等于0.200000000000000011102230246251565404236316680908203125,,这是因为0.1无法准确地表示为double。这样,传入构造方法的值不会正好等于0.2
-
BigDecimal(String val)
将String表示形式转换成BigDecimal
BigDecimal stringBigDecimal = new BigDecimal("0.2"); System.out.println(stringBigDecimal);//0.2
- String构造方法是完全可预知的。优先使用String构造方法
2、当double必须做BigDecimal的源时
- Double.toString()转String
BigDecimal valueOf = BigDecimal.valueOf(2.3);
- 静态方法valueOf()
BigDecimal toString = new BigDecimal(Double.toString(2.3));
三、 BigDecimal加减乘除运算
-
加法 add()
BigDecimal a = new BigDecimal("4.5"); BigDecimal b = new BigDecimal("1.5"); System.out.println("a+b = " + a.add(b))//a+b = 6.0
-
减法 subtract()
System.out.println("a-b = " + a.subtract(b));//a-b = 3.0
-
乘法 multiply
System.out.println("a*b = " + a.multiply(b));//a*b = 6.75
-
除法 divide
System.out.println("a+b = " + a.divide(b));//a+b = 3
-
public BigDecimal divide(BigDecimal divisor, int scale, int roundingMode)
第一参数表示除数, 第二个参数表示小数点后保留位数,
第三个参数表示舍入模式,只有在作除法运算或四舍五入时才用到舍入模式 -
四舍五入采用 ROUND_HALF_UP
-
- 注意:
加减乘除最终返回的都是一个新的BigDecimal对象,原来的a不变