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
double类型问题(精度丢失和自动拆箱)相关推荐
- java double 装箱_Java自动拆箱和装箱
一.什么是装箱/拆箱 在讲之前,得先提一下为什么两个概念:基本数据类型及其包装类,我们都知道Java是一种面向对象的语言,但是Java中的基本数据类型是不面向对象的,这时在使用中便会存在诸多的不便,为 ...
- Java进阶之自动拆箱与自动装箱
序. java基本类型介绍 java中,基本数据类型一共有8种,详细信息如下表: 类型 大小 范围 默认值 byte 8 -128 - 127 0 short 16 -32768 - 32768 0 ...
- java 自动装箱自动拆箱_自动装箱和自动拆箱
自动装箱和自动拆箱 Java 提供了 8 种基本数据类型,每种数据类型都有其对应的包装类型,包装类是面向对象的类,是一种高级的数据类型,可以进行一些比较复杂的操作,它们是引用类型而不再基本类型了. 基 ...
- JDK 1.5 新特性——自动拆箱装箱
1.5版本支持了自动包装和解包操作,对于bool/Boolean,byte/Byte,double/Double,short/Short,int/Integer, long/Long,float/Fl ...
- java 自动拆箱_Java 自动装箱 和 自动拆箱
自动装箱:/** * 实际上,程序运行时,系统为我们执行了下面一条语句: * Integer number = new Integer(290); */ Integer number = 290; S ...
- Java自动拆箱陷阱。 谨防!
您认为以下代码段会显示什么? Object o = true ? new Integer(1) : new Double(2.0); System.out.println(o); 是! 它将打印: 1 ...
- 自动装箱自动拆箱java,自动装箱?拆箱?==问题?详解java面试常见的一个问题...
1:前言 相信大家都在面试中都被问到过一个问题,这个问题也是近年来面试官刁难人比较常见的一个问题,所以也被大家所熟知了,本质上也很简单,但是也是非常基础的一个题目. Integer a = 100; ...
- Java 进阶——自动装箱和自动拆箱
1.什么是自动装箱拆箱 基本数据类型的自动装箱(autoboxing).拆箱(unboxing)是自J2SE 5.0开始提供的功能. 一般我们要创建一个类的对象实例的时候,我们会这样: Class a ...
- 如何理解Java中的自动拆箱和自动装箱?
小伟刚毕业时面的第一家公司就被面试官给问住了,记忆尤深啊- 如何理解Java中的自动拆箱和自动装箱? 自动拆箱?自动装箱?什么鬼,听都没听过啊,这-这-知识盲区- 回到家后小伟赶紧查资料,我透,这不就 ...
最新文章
- 用Graphviz来画图 1
- 项目实施中应该注意的事项
- endnote转化成纯文本后_如何用Endnote分分钟搞定参考文献
- 也跟90后小朋友聊聊
- Oracle10g下载地址
- [转载] 的士速递3
- 【STM32 .Net MF开发板学习-03】TinyGUI绘图示例
- 1133 Splitting A Linked List
- Win10家庭版共享打印机
- 工业互联网平台TOP15发布!附15个平台详细介绍!
- Geforce 错误代码 ERROR CODE:0x0003问题方法
- ae渲染存在偏移_E3依旧是最好选择.千元游戏渲染主机该如何搭配
- 电商项目 java 毕业设计_Java电商毕业设计总结(二)
- AI人工智能毕业设计课题:动物识别系统
- python实现自动按键_Python使用pyautogui模块实现自动化鼠标和键盘操作示例
- STM32 BMP图片解析
- linux查看cpu核数和内存指令
- 【无人机学习】Mission Planner(pc端)和QGroundControl(android端)
- virtualbox安装redhat,正常关闭后需要重新安装原因分析及解决方案
- PC之父埃德·罗伯茨4月1日离世,比尔盖茨、保罗艾伦联合宣布
热门文章
- 学习华为,小米研究 AI 芯片
- signature=fc89d4352b6699754c14ce282ec75426,Ballistic demining protective armor
- 宏用于所有的excel文件
- java 静态分析_静态代码分析与代码质量安全
- CCRC信息安全服务资质--软件开发-简单介绍
- Qt使用第三方串口类qextserialport无法打开串口的可能解决方案(文章中描述的可以解决)
- 下载文件时,文件名的设置
- 【整理分享】14张思维导图构建 Python 核心知识体系
- 去除WPS推广程序和广告
- 密码加密之bcrypt