最近在工作中使用了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

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

  1. java double 装箱_Java自动拆箱和装箱

    一.什么是装箱/拆箱 在讲之前,得先提一下为什么两个概念:基本数据类型及其包装类,我们都知道Java是一种面向对象的语言,但是Java中的基本数据类型是不面向对象的,这时在使用中便会存在诸多的不便,为 ...

  2. Java进阶之自动拆箱与自动装箱

    序. java基本类型介绍 java中,基本数据类型一共有8种,详细信息如下表: 类型 大小 范围 默认值 byte 8 -128 - 127 0 short 16 -32768 - 32768 0 ...

  3. java 自动装箱自动拆箱_自动装箱和自动拆箱

    自动装箱和自动拆箱 Java 提供了 8 种基本数据类型,每种数据类型都有其对应的包装类型,包装类是面向对象的类,是一种高级的数据类型,可以进行一些比较复杂的操作,它们是引用类型而不再基本类型了. 基 ...

  4. JDK 1.5 新特性——自动拆箱装箱

    1.5版本支持了自动包装和解包操作,对于bool/Boolean,byte/Byte,double/Double,short/Short,int/Integer, long/Long,float/Fl ...

  5. java 自动拆箱_Java 自动装箱 和 自动拆箱

    自动装箱:/** * 实际上,程序运行时,系统为我们执行了下面一条语句: * Integer number = new Integer(290); */ Integer number = 290; S ...

  6. Java自动拆箱陷阱。 谨防!

    您认为以下代码段会显示什么? Object o = true ? new Integer(1) : new Double(2.0); System.out.println(o); 是! 它将打印: 1 ...

  7. 自动装箱自动拆箱java,自动装箱?拆箱?==问题?详解java面试常见的一个问题...

    1:前言 相信大家都在面试中都被问到过一个问题,这个问题也是近年来面试官刁难人比较常见的一个问题,所以也被大家所熟知了,本质上也很简单,但是也是非常基础的一个题目. Integer a = 100; ...

  8. Java 进阶——自动装箱和自动拆箱

    1.什么是自动装箱拆箱 基本数据类型的自动装箱(autoboxing).拆箱(unboxing)是自J2SE 5.0开始提供的功能. 一般我们要创建一个类的对象实例的时候,我们会这样: Class a ...

  9. 如何理解Java中的自动拆箱和自动装箱?

    小伟刚毕业时面的第一家公司就被面试官给问住了,记忆尤深啊- 如何理解Java中的自动拆箱和自动装箱? 自动拆箱?自动装箱?什么鬼,听都没听过啊,这-这-知识盲区- 回到家后小伟赶紧查资料,我透,这不就 ...

最新文章

  1. 用Graphviz来画图 1
  2. 项目实施中应该注意的事项
  3. endnote转化成纯文本后_如何用Endnote分分钟搞定参考文献
  4. 也跟90后小朋友聊聊
  5. Oracle10g下载地址
  6. [转载] 的士速递3
  7. 【STM32 .Net MF开发板学习-03】TinyGUI绘图示例
  8. 1133 Splitting A Linked List
  9. Win10家庭版共享打印机
  10. 工业互联网平台TOP15发布!附15个平台详细介绍!
  11. Geforce 错误代码 ERROR CODE:0x0003问题方法
  12. ae渲染存在偏移_E3依旧是最好选择.千元游戏渲染主机该如何搭配
  13. 电商项目 java 毕业设计_Java电商毕业设计总结(二)
  14. AI人工智能毕业设计课题:动物识别系统
  15. python实现自动按键_Python使用pyautogui模块实现自动化鼠标和键盘操作示例
  16. STM32 BMP图片解析
  17. linux查看cpu核数和内存指令
  18. 【无人机学习】Mission Planner(pc端)和QGroundControl(android端)
  19. virtualbox安装redhat,正常关闭后需要重新安装原因分析及解决方案
  20. PC之父埃德·罗伯茨4月1日离世,比尔盖茨、保罗艾伦联合宣布

热门文章

  1. 学习华为,小米研究 AI 芯片
  2. signature=fc89d4352b6699754c14ce282ec75426,Ballistic demining protective armor
  3. 宏用于所有的excel文件
  4. java 静态分析_静态代码分析与代码质量安全
  5. CCRC信息安全服务资质--软件开发-简单介绍
  6. Qt使用第三方串口类qextserialport无法打开串口的可能解决方案(文章中描述的可以解决)
  7. 下载文件时,文件名的设置
  8. 【整理分享】14张思维导图构建 Python 核心知识体系
  9. 去除WPS推广程序和广告
  10. 密码加密之bcrypt