浮点型丢失精度解决办法
1、浮点型Float Double 在计算过程中 精度会在一定程度上丢失 为了解决精度丢失的问题 JDK 给我们提供解决方案 利用String、BigDecimal作为中介
丢失原因:计算机只能识别二进制,浮点数参与运算,首先会转换为二进制,再参与运算;在转换的过程中发生了数据丢失(至于具体原因这里不做详细阐述);
2、两个数相加Add
1 public static double add(double d1, double d2) { 2 BigDecimal b1 = new BigDecimal(Double.toString(d1)); 3 BigDecimal b2 = new BigDecimal(Double.toString(d2)); 4 return b1.add(b2).doubleValue(); 5 }
3、两个数减法Sub:
1 public static double sub(double d1, double d2) { 2 BigDecimal b1 = new BigDecimal(Double.toString(d1)); 3 BigDecimal b2 = new BigDecimal(Double.toString(d2)); 4 return b1.subtract(b2).doubleValue(); 5 }
4、两个数除法Div:
1 /** 2 * 3 * @param d1 被除数 4 * @param d2 除数 5 * @param scale 保留小数位数 6 * @return 7 */ 8 public static double div(double d1, double d2, int scale) { 9 if (scale < 0) { 10 throw new IllegalArgumentException("The scale must be a positive integer or zero"); 11 } 12 BigDecimal b1 = new BigDecimal(Double.toString(d1)); 13 BigDecimal b2 = new BigDecimal(Double.toString(d2)); 14 return b1.divide(b2, scale, BigDecimal.ROUND_HALF_UP).doubleValue(); 15 }
5、有人将上述方法封装为Arith类,引入包,可以直接静态调用。