最近在工作中使用了double类型,遇到了2个问题。一个是自动拆箱,一个是精度丢失。
一.像Long,Integer类型直接使用时会进行自动拆箱,但是使用Double型时不会进行自动拆箱(所使用的JAVA版本是jdk1.6.0_31)。测试代码如下:
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值相等");
}
}
}
输出结果为: Long值相等
在这过程中1L被自动装箱为Long类型,在进行if语句时又拆箱为long类型。而Double类型只装箱没有拆箱(至于原因还待研究),所以导致最终的结果。
解决方案很简单:1. 调用Double的doubleValue()手动转为double型进行值比较。
2.调用Double的equals()方法进行比较。
出错场景:直接使用了List<Double> sortResultList = new ArrayList<Double>();
Map<Long,Double> resultMap = new HashMap<Long, Double>();
拿List和Map中的值进行比较使用了==。因为平时Double类型使用较少,而Long Integer使用较多,且他俩使用==不会有问题,所以就想当然的用了==,这种问题一般出了很难查出,尤其是在计算逻辑比较复杂的情况下,而我这次刚好是这场景。
二.精度丢失问题
用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型得千万小心。
764

被折叠的 条评论
为什么被折叠?



