double类型问题(精度丢失和自动拆箱)

  最近在工做中使用了double类型,遇到了2个问题。一个是自动拆箱,一个是精度丢失。 测试

  一.像Long,Integer类型直接使用时会进行自动拆箱,可是使用Double型时不会进行自动拆箱(所使用的JAVA版本是jdk1.6.0_31)。测试代码以下: spa

public class Test {  
    private  Long l1 = 1L;
    private  Long l2 = 1L;
    private Double d1 =1d;
    private Double d2 =1d;
    public static void main(String[] args) {  
        Test t = new Test();
        if(t.l1==t.l2) {
            System.out.println("Long值相等");
        }
        if(t.d1==t.d2) {
            System.out.println("Double值相等");
        }
    }  
    
} ip

输出结果为:    Long值相等 ci

在这过程当中1L被自动装箱为Long类型,在进行if语句时又拆箱为long类型。而Double类型只装箱没有拆箱(至于缘由还待研究),因此致使最终的结果。 class

解决方案很简单:1. 调用Double的doubleValue()手动转为double型进行值比较。 jdk

                      2.调用Double的equals()方法进行比较。 List

出错场景:直接使用了List<Double> sortResultList = new ArrayList<Double>(); 方法

          Map<Long,Double>  resultMap = new HashMap<Long, Double>(); im

拿List和Map中的值进行比较使用了==。由于平时Double类型使用较少,而Long Integer使用较多,且他俩使用==不会有问题,因此就想固然的用了==,这种问题通常出了很难查出,尤为是在计算逻辑比较复杂的状况下,而我此次恰好是这场景。 sort

 二.精度丢失问题

     用doule型值进行运算容易形成精度丢失,使结果不许确。

解决方案:经过String 结合BigDecimal。

如:

public class MathUtil {          public static double mul(double v1, double v2) {     BigDecimal b1 = new BigDecimal(Double.toString(v1));     BigDecimal b2 = new BigDecimal(Double.toString(v2));     return b1.multiply(b2).doubleValue();     }          public static double sum(double v1, double v2) {     BigDecimal b1 = new BigDecimal(Double.toString(v1));     BigDecimal b2 = new BigDecimal(Double.toString(v2));     return b1.add(b2).doubleValue();     }          public static void main(String[] args) {              } } 总之,使用Double型得千万当心。

相关文章
相关标签/搜索