double类型(浮点数)是否相等的判断方法 |
您所在的位置:网站首页 › 两个double类型比较大小 › double类型(浮点数)是否相等的判断方法 |
浮点数不精确
计算机内部无法用二进制的小数来精确的表达。 public class Tesz { public static void main(String[] args) { double a = 0.1; float c = 0.1f; System.out.println(a==c);//输出false } } 如果运算符任意一方的类型为double,则另一方会转换为double否则,如果运算符任意一方的类型为float,则另一方会转换为float否则,如果运算符任意一方的类型为long,则另一方会转换为long否则,两边都会转换为int根据IEEE 754,单精度的float是32位,双精度的double为64位 第一部分(s)为符号位,第二部分(exponent)为指数位,第三部分(mantissa)为基数部分。 这是科学计数法的二进制表示。 比如像3.1415926.。。。 或者无限无限循环小数,就会将不能标识的部分舍掉。二进制无法精确表示浮点数 二进制为什么无法精确表示浮点数 单精度浮点数0.1表示成二进制 System.out.println(Integer.toBinaryString(Float.floatToIntBits(0.1f))); 结果是:111101110011001100110011001101 双精度的浮点数0.1的二进制 System.out.println(Long.toBinaryString(Double.doubleToLongBits(0.1d))); 结果是:11111110111001100110011001100110011001100110011001100110011010 float转换后的double的值已经和直接赋值的double的值比较 System.out.println(Long.toBinaryString(Double.doubleToLongBits(0.1f))); 结果是:11111110111001100110011001100110100000000000000000000000000000 很明显不一样二进制小数的表达形式 根据国际标准IEEE 754,任意一个二进制浮点数V可以表示成下面的形式:
(1)(-1)^s表示符号位,当s=0,V为正数;当s=1,V为负数。 (2)M表示有效数字,大于等于1,小于2。 (3)2^E表示指数位。 举个例子 用二进制表达十进制的 0.2 0.01 = 1/4 = 0.25 ,太大 0.001 =1/8 = 0.125 , 又太小 0.0011 = 1/8 + 1/16 = 0.1875 , 逼近0.2了 0.00111 = 1/8 + 1/16 + 1/32 = 0.21875 , 又大了 0.001101 = 1/8+ 1/16 + 1/64 = 0.203125 还是大 0.0011001 = 1/8 + 1/16 + 1/128 = 0.1953125 这结果不错 0.00110011 = 1/8+1/16+1/128+1/256 = 0.19921875 ....................................................... 第一种方法:转换成字符串如果要比较的两个浮点数数据的字符串精度相等,可以将数据转换成string然后借助string的equals方法来间接实现比较两个double数据是否相等。注意这种方法只适用于比较精度相同的数据,并且是只用用于比较是否相等的情况下,不能用来判断大小。 Float.toString(453.2348f).equals(Float.toString(0.342f)) Double.toString(0.8456d).equals(Float.toString(0.242f)) 第二种方法:使用sun提供的Double.doubleToLongBits()方法该方法可以将double转换成long型数据,从而可以使double按照long的方法(, ==)判断是否大小和是否相等。 Double.doubleToLongBits(0.01) == Double.doubleToLongBits(0.01) Double.doubleToLongBits(0.02) > Double.doubleToLongBits(0.01) Double.doubleToLongBits(0.02) < Double.doubleToLongBits(0.01) 第三种方法:误差内比较对于double类型,比如double d1=0.0000001,double d2=0d 当判断两个数据d1和d2是否相等的时候,一般不直接使用 if(d1==d2) ... ![]() a和b表示为NaN(Not a Number) ,并不是数字,无法比较。 总结在进行浮点数比较的时候,主要需要考虑3个因素 NaN无穷大/无穷小舍入误差所以,要比较浮点数是否相等,需要做的事情是: 排除NaN和无穷在精度范围内进行比较 参考连接https://blog.csdn.net/renwotao2009/article/details/51637163 http://en.wikipedia.org/wiki/Floating_point https://blog.csdn.net/wcxiaoych/article/details/42806313# https://www.ruanyifeng.com/blog/2010/06/ieee_floating-point_representation.html 本公众号分享自己从程序员小白到经历春招秋招斩获10几个offer的面试笔试经验,其中包括【Java】、【操作系统】、【计算机网络】、【设计模式】、【数据结构与算法】、【大厂面经】、【数据库】期待你加入!!! 1.计算机网络----三次握手四次挥手2.梦想成真-----项目自我介绍 3.你们要的设计模式来了 4.一字一句教你面试“个人简介” 5.接近30场面试分享 6.你们要的免费书来了 |
今日新闻 |
点击排行 |
|
推荐新闻 |
图片新闻 |
|
专题文章 |
CopyRight 2018-2019 实验室设备网 版权所有 win10的实时保护怎么永久关闭 |