BigDecimal用作商业计算的。
BigDecimal aDouble =new BigDecimal(1.22); 输出:1.2199999999999999733546474089962430298328399658203125
BigDecimal aString = new BigDecimal("1.22"); 输出:1.22
以上两者输出结果是不一样的。
原因:
double的构造方法有不可预知性。
String的构造方法是固定的值。
所以如果类型是Double的话,而且需要精确计算,就用下面方法:
Double.toString(double)方法,可以先转为String,然后再用new BigDecimal("")构造方法。
注意:BigDecimal都是不可变的(immutable)的,在进行每一步运算时,都会产生一个新的对象,所以在做加减乘除运算时千万要保存操作后的值
demo测试
package Util;
import java.math.BigDecimal;
public class BigDecimalUtil {
private BigDecimalUtil(){}
public static BigDecimal add(double v1,double v2){
BigDecimal b1=new BigDecimal(Double.toString(v1));//此处注意转换为了String类型
BigDecimal b2=new BigDecimal(Double.toString(v2));
return b1.add(b2);
}
private static BigDecimal sub(double v1,double v2){
BigDecimal b1=new BigDecimal(Double.toString(v1));
BigDecimal b2=new BigDecimal(Double.toString(v2));
return b1.subtract(b2);
}
private static BigDecimal mul(double v1,double v2){
BigDecimal b1=new BigDecimal(Double.toString(v1));
BigDecimal b2=new BigDecimal(Double.toString(v2));
return b1.multiply(b2);
}
private static BigDecimal div(double v1,double v2){
BigDecimal b1=new BigDecimal(Double.toString(v1));
BigDecimal b2=new BigDecimal(Double.toString(v2));
return b1.divide(b2,2,BigDecimal.ROUND_HALF_UP);//四舍五入保留两位小数
}
public static void main(String[] args) {
System.out.println(new BigDecimal(1.2));
System.out.println(new BigDecimal("1.2"));
System.out.println(2.0-1.1);
System.out.println(BigDecimalUtil.sub(2.0,1.1));
}
}
运行结果
1.1999999999999999555910790149937383830547332763671875
1.2
0.8999999999999999
0.9