一、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