浮点型丢失精度解决办法

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类,引入包,可以直接静态调用。

posted on 2015-11-05 14:41  夜雨梧桐  阅读(687)  评论(0编辑  收藏  举报

导航