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

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



 

转载于:https://my.oschina.net/u/1172326/blog/140905

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值