精度问题在商业计算中非常重要,比如价格计算,概率计算,java在处理精度问题时可以使用BigDecimal类,详细见以下代码
1 import java.math.BigDecimal; 2 3 4 public class BigDecimalUtil { 5 6 public static void main(String[] args) { 7 System.out.println(0.05+0.01);//输出 : 0.060000000000000005 8 //假设两件商品中价格是0.05 0.01 从输出结果中可以看出 那么0.06元是买不了这两件商品的 9 System.out.println(0.06==(0.05+0.01));//输出 : false 10 System.out.println(1-0.42);//输出 : 0.5800000000000001 11 System.out.println(4.015*100);//输出 : 401.49999999999994 12 System.out.println(123.3/100);//输出 :1.2329999999999999 13 System.out.println(add(0.05, 0.01).doubleValue()==0.06);//输出 :true 14 sub(1D, 0.42); 15 multiply(4.015, 100D); 16 divide(123.3, 100D); 17 } 18 19 public static BigDecimal add(Double d1 , Double d2) { 20 BigDecimal b1 = new BigDecimal(d1.toString());//一定要使用String 的构造器 否则会丢失精度 21 BigDecimal b2 = new BigDecimal(d2.toString()); 22 return b1.add(b2); 23 } 24 25 public static BigDecimal sub(Double d1 , Double d2) { 26 BigDecimal b1 = new BigDecimal(d1.toString()); 27 BigDecimal b2 = new BigDecimal(d2.toString()); 28 return b1.subtract(b2); 29 } 30 public static BigDecimal multiply(Double d1 , Double d2) { 31 BigDecimal b1 = new BigDecimal(d1.toString()); 32 BigDecimal b2 = new BigDecimal(d2.toString()); 33 return b1.multiply(b2); 34 } 35 public static BigDecimal divide(Double d1 , Double d2) { 36 BigDecimal b1 = new BigDecimal(d1.toString()); 37 BigDecimal b2 = new BigDecimal(d2.toString()); 38 return b1.divide(b2,2,BigDecimal.ROUND_HALF_UP);//这里是四舍五入 并且保留X位小数 默认两位 39 } 40 }