一、BigDecimal的加减乘除:
package com.cy.test.math;
import java.math.BigDecimal;
public class TestBigDecimal {
public static void main(String[] args) {
//加法
double d1 = 1.234;
double d2 = 2.341;
System.out.println(d1 + d2); //3.575
System.out.println(d1 * d2); //2.8887940000000003精度出问题了
System.out.println(d1 / d2); //0.5271251601879539 这个是对的
//使用BigDecimal,加法
BigDecimal b1 = new BigDecimal(Double.toString(d1));
BigDecimal b2 = new BigDecimal(Double.toString(d2));
System.out.println(b1.add(b2).doubleValue()); //3.575
//减法
System.out.println(b1.subtract(b2).doubleValue()); //-1.107
//乘法
System.out.println(b1.multiply(b2).doubleValue()); //2.888794
//除法 保留小数点后两位,四舍五入
System.out.println(b1.divide(b2, 2, BigDecimal.ROUND_HALF_UP)); //0.53
}
}
二、BigDecimal转String的时候出现的精度问题:
有些两位类型的小数如double类型的,直接转化为String时,调用的是BigDecimal的toString方法,会出现精度问题。解决办法:
package com.cy.test.math;
import java.math.BigDecimal;
public class TestBigDecimal3 {
public static void main(String[] args) {
BigDecimal b1 = new BigDecimal(1.23);
BigDecimal b2 = new BigDecimal(1.24);
BigDecimal b3 = new BigDecimal(1.25);
System.out.println(b1);
System.out.println(b2);
System.out.println(b3);
BigDecimal plus = b1.add(b2).add(b3);
//直接打印会精度失真
System.out.println(plus);
System.out.println(String.valueOf(plus.floatValue()));
//设置小数位数,第一个变量是小数位数,第二个变量是取舍方法(四舍五入)
BigDecimal plus2 = b1.add(b2).add(b3).setScale(2, BigDecimal.ROUND_HALF_UP);
System.out.println(plus2);
}
}
打印结果:
1.229999999999999982236431605997495353221893310546875 1.2399999999999999911182158029987476766109466552734375 1.25 3.7199999999999999733546474089962430298328399658203125 3.72 3.72