`
xubindehao
  • 浏览: 246048 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

java中比较float和double的大小

 
阅读更多

 


分类: Java 553人阅读 评论(1) 收藏 举报

转自:http://blog.csdn.net/running8063/article/details/4093261

最近在项目中碰到了一个业务逻辑计算,代码如下(示例代码)

double val1 = ...;

double val2 = ...,

double dif = ...,

if (Math.abs(val1 - val2-dif) == 0){

  //do things

}

 

结果发现有一组数据:61.5,60.4,1.1无法达到正确的结果.有经验的开发人员一眼就可以发现问题所在,也知道应该采用如下的方式修改代码(产品模式下要进行代码的抽取和封装):

double exp = 10E-10;

if (Math.abs(val1 - val2-dif)>-1*exp && Math.abs(val1 - val2-dif)<exp){

 //do things

}

 

那为什么上面代码中"Math.abs(val1 - val2-dif) == 0"的值为什么会是false呢?这就引申到java的一个基础问题,即java中浮点数的存储机制.

 

Java 中的浮点数分为单精度和双精度数,也就是float和double.

 

float在内存中跟int一样,占4个字节,32 bit.

 

第1个bit表示符号,0表示正数,1表示负数,这个很好理解,不用多管.

 

第2-9个bit表示指数,一共8位(可以表示0-255),这里的底数是2,为了同时表示正数和负数,这里要减去127的偏移量.这样的话范围就是(-127到128),

另外全0和全1作为特殊处理,所以直接表示-126到127.

 

剩下的23位表示小数部分,这里23位表示了24位的数字,因为有一个默认的前导1(只有二进制才有这个特性).

 

     最后结果是:(-1)^(sign) * 1.f * 2^(exponent)

     这里:sign是符号位,f是23bit的小数部分,exponent是指数部分,最后表示范围是(因为正负数是对称的,这里只关心正数)

    2^(-126) ~~ 2(1-2^(-24)) * 2^127

    这个还不是float的取值范围,因为标准中还规定了非规格化表示法,另外还有一些特殊规定.

 

非规格化表示:

    当指数部分全0而且小数部分不全0时表示的是非规格化的浮点数,因为这里默认没有前导1,而是0.

    取值位0.f * 2^(-126),表示范围位 2^(-149)~~ (1-2^(-23)) * 2^(-126) 这里没有考虑符号.这里为什么是-126而不是-127? 如果是-127的话,那么最大表示为

2^(-127)-2^(-149),很显然2^(-127) ~~2^(-126) 就没法表示了.

 

 

其他特殊表示

    1.当指数部分和小数部分全为0时,表示0值,有+0和-0之分(符号位决定),0x00000000表示正0,0x80000000表示负0.

    2.指数部分全1,小数部分全0时,表示无穷大,有正无穷和负无穷,0x7f800000表示正无穷,0xff800000表示负无穷.

    3.指数部分全1,小数部分不全0时,表示NaN,分为QNaN和SNaN,Java中都是NaN.

 

结论:

    可以看出浮点数的取值范围是:2^(-149)~~(2-2^(-23))*2^127,也就是Float.MIN_VALUE和Float.MAX_VALUE.

 

References:

http://blog.csdn.net/treeroot/archive/2004/09/05/95071.aspx

http://hi.baidu.com/520miner/blog/item/698266ed9ee000d7b31cb1aa.html

 

分享到:
评论

相关推荐

    java图片压缩文件大小图片大小(支持gif动态图)

    首先,Java中的核心库`javax.imageio`提供了对图片读取、写入和处理的基本支持。我们可以通过`ImageIO`类来读取图片,然后使用`BufferedImage`对象进行操作。例如,以下代码可以读取一个图片文件: ```java import ...

    Java中long类型与Long类型的区别和大小比较详解

    Java中long类型与Long类型的区别和大小比较详解 在Java中,long类型和Long类型都是用于表示数字的数据类型,但是它们之间存在着一定的区别。long类型是基本数据类型,而Long类型是对象类型,本文将通过示例代码详细...

    Java中BigDecimal的加减乘除、比较大小与使用注意事项

    这是因为`float`和`double`类型虽然适用于科学计算和工程计算,但它们基于二进制浮点运算,不能保证完全精确的结果。而`BigDecimal`类提供了对任意精度的十进制数的支持,确保了商业计算中的准确性。 ### `...

    C#和java数据类型的等价类型

    本文将对C#和Java中的数据类型进行比较和分析,帮助开发者更好地理解和使用这些数据类型。 一、布尔类型 在C#和Java中,布尔类型用于存储 true 或 false 两个值。C#中的布尔类型对应Java中的boolean类型。它们都...

    Java中数据类型和MYSQL中数据类型的对比

    FLOAT 和 DOUBLE 用于存储近似数值,与 Java 中的浮点类型相对应。BIT 类型用于存储位字段值,适用于二进制数据。 2. 日期和时间类型:MySQL 的日期和时间类型包括 DATETIME、DATE、TIMESTAMP、TIME 和 YEAR。...

    java之java类型转换

    Java 中的简单类型包括 boolean、byte、char、short、int、long、float、double 和 void 八种类型,每种类型都有其对应的封装器类,如 Boolean、Byte、Character、Short、Integer、Long、Float、Double 和 Void。...

    Java之基本数据类型 Sizeof 大小

    在Java编程语言中,了解基本数据类型的大小是至关重要的,因为这直接影响到程序的内存管理和性能。`Sizeof` 在Java中并不存在,与C++等语言不同,Java没有提供直接计算对象或变量在内存中占用字节数的内置方法。然而...

    比较Max and min大小

    Java中的基本类型如int、long、float和double都有比较运算符,如`, `&gt;`, `, `&gt;=`和`==`。例如,要比较两个int变量max和min的大小,可以使用以下代码: ```java int max = 100; int min = 50; if (max &gt; min) { ...

    java中的栈(深层了解java虚拟机对对象的内存分布)

    基本类型包括int、long、float、double、boolean和char等,它们的实例存储于栈中,因为这些类型的大小和生命周期是已知的,便于优化访问速度。另一方面,所有引用类型,如包装类(Integer、String、Double等),以及...

    java中堆(heap)和堆栈(stack)有什么区别

    "Java 中堆(heap)和堆栈(stack)的区别" Java 中堆(heap)和堆栈(stack)是两个不同的内存区域,分别用于存储不同的数据类型和对象。堆栈(stack)是 Java 中的一种内存区域,用于存储基本类型的变量和对象的...

    面试常见问题-Java

    * Java 中有九种基本数据类型:boolean、byte、char、short、int、long、float、double 和 void * 每种基本数据类型都有对应的封装类:Boolean、Byte、Character、Short、Integer、Long、Float、Double 和 Void * ...

    Java 中的堆和栈

    首先,栈内存主要负责存储基础数据类型(如byte, short, int, long, float, double, boolean, char)和对象的引用。当在代码中声明一个局部变量时,Java会在栈中为其分配空间。一旦变量超出其作用域,Java会自动释放...

    计算一个Java对象占用字节数的方法

    这是对象中包含的基本数据类型字段,如boolean、byte、char、short、int、float、long和double。它们各自占用不同的字节数,如boolean和byte占1字节,char和short占2字节,int和float占4字节,long和double占8字节。...

    Java编程中须注意的细节.pdf

    在Java中,使用浮点数(如float和double)进行计算时可能会出现精度问题。由于二进制浮点数不能精确地表示一些十进制小数,例如1.1在二进制中无法精确表示,所以进行浮点数计算时需要注意其结果的不确定性。为了解决...

    JAVA对象以及数据的工具类

    Java有八种原始数据类型:byte、short、int、long、float、double、char和boolean。为了方便处理这些类型,Java提供了一些内置类,如Integer、Double等,它们是原始类型的包装类。包装类提供了许多便利的方法,例如...

    java笔试题 大学生应聘

    原始类型封装类,booleanBoolean,charCharacter,byteByte,shortShort,intInteger,longLong,floatFloat,doubleDouble引用类型和原始类型的行为完全不同,并且它们具有不同的语义。引用类型和原始类型具有不同的特征和...

    Java核心基础+Java中的数据在内存中的存储

    Java的基本数据类型包括`int`、`short`、`long`、`byte`、`float`、`double`、`boolean`和`char`。这些类型的数据通常存储在栈中,因为它们的大小是固定的且生命周期明确。例如: ```java int a = 3; // 存储在栈中...

    java中内存分配

    在 Java 中,基本数据类型共有 8 种,即 int, short, long, byte, float, double, boolean, char。这些类型的定义是通过诸如 int a = 3; long b = 255L;的形式来定义的,称为自动变量。值得注意的是:自动变量存的...

    10万字总结java面试题和答案.pdf

    - Java中的基本数据类型包括int、short、byte、long、float、double、boolean和char。 - 封装类分别是Integer、Short、Byte、Long、Float、Double、Boolean和Character,它们实现了基本数据类型到对象的自动装箱和...

    java中堆和栈的区别.pdf

    Java中堆和栈的区别 Java是一种面向对象的编程语言,它的内存管理机制是自动化的,程序员不需要手动地分配和释放内存。Java中堆和栈是两个重要的概念,它们都是Java用于在RAM中存放数据的地方。 栈(Stack)是一块...

Global site tag (gtag.js) - Google Analytics