当前位置: 代码迷 >> J2SE >> jdk1.7 Double float 的最大值 跟 最小值 不同
  详细解决方案

jdk1.7 Double float 的最大值 跟 最小值 不同

热度:471   发布时间:2016-04-23 19:38:08.0
jdk1.7 Double float 的最大值 和 最小值 不同

public class duliang {
public static void main(String[] args) {

double a1 = Double.MAX_VALUE;
double a2 = Double.MIN_VALUE;
float b1 = Float.MAX_VALUE;
float b2 = Float.MIN_VALUE;
int c1 = Integer.MAX_VALUE;
int c2 = Integer.MIN_VALUE;

System.out.print("Double.MAX_VALUE="+a1+"--");
System.out.println("Double.MIN_VALUE"+a2);
System.out.print("Float.MAX_VALUE"+b1+"--");
System.out.println("Float.MIN_VALUE"+b2);
System.out.print("Integer.MAX_VALUE"+c1+"-");
System.out.println("Integer.MIN_VALUE"+c2);

System.out.println((float)1/60);
System.out.println((float)1/60);

}
输出 是这样,为什么 Double float  的最大值 和 最小值 不同呢
Double.MAX_VALUE=1.7976931348623157E308--Double.MIN_VALUE4.9E-324
Float.MAX_VALUE3.4028235E38--Float.MIN_VALUE1.4E-45
Integer.MAX_VALUE2147483647-Integer.MIN_VALUE-2147483648

------解决思路----------------------
http://blog.csdn.net/bingduanlbd/article/details/27790287

你可以做几次浮点数转换为二进制的练习就明白了
------解决思路----------------------
引用:
Quote: 引用:

Quote: 引用:

Quote: 引用:

一个单精度32位
一个双精度64位 
你告诉我怎么相同....

我的意思是 double 的最大 和 最小值 为什么 不是-1.7E308到+1.7E308
而是1.7976931348623157E308 到 4.9E-324
Double.MAX_VALUE=1.7976931348623157E308 Double.MIN_VALUE4.9E-324


源码里 public static final double MIN_VALUE = 0x0.0000000000001P-1022; // 4.9e-324
并有说明: A constant holding the smallest positive nonzero value of type
很明显java里的float是无符号浮点型,和C不同而已

无符号, double float 都是正数 

 float a = -34.34;
可以这样声明变量并赋值a,这样不就表示负数了吗



这个,重新看了下源码,java好像没有什么有无符号之分
和C的含义不同,java里的最小值指的是能表示的最小精度,而不是所谓的最大负数
没注意过这个
------解决思路----------------------
根据ieee 754标准,浮点数分为三部分:符号位,浮点部分,数值部分。
其中符号位占1位,所以任何数都有正负之分(比如+0和-0)。因此浮点数在数轴上表示的范围应该是原点对称的,大致像这样:

 ---- -MAX ---------- -MIN ---------  -0 +0 --------  +MIN ---------- +MAX ------>

你会发现其中有好几段空白。它不能表示绝对值大于max的值,也不能表示绝对值小于min的值。Java给出的就是这里的min和max,与整数的概念不同。

又因为它的浮点是二进制浮点,且采用的不是补码表示,且数值部分是二进制浮点,只有一位(一定是1)在小数点前,其他位都在小数点后,导致min的指数比max大一些。

具体还是要看看浮点数的内存表示法,才能明白。
------解决思路----------------------
JAVA中的浮点运算是不准确的,要做精确的浮点型运算,用Bigdecimal类
  相关解决方案