最近在工做中使用了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型得千万当心。