Float之谜

先来看几个例子:

public class Thirtyfirst1{
        public static void main(String[] args){
                int i = 2000000000;
                int count = 0;
                for(float f = i; f < i + 50 ; f ++){
                        count++;
                }
                System.out.println(count);
        }
}

会输出多少?

public class Thirtyfirst1{
        public static void main(String[] args){
                int i = 2000000000;
                int count = 0;
                for(float f = i; f < i + 64 ; f ++){
                        count++;
                }
                System.out.println(count);
        }
}

这个会输出多少?

public class Thirtyfirst1{
        public static void main(String[] args){
                int i = 2000000000;
                int count = 0;
                for(float f = i; f < i + 65 ; f ++){
                        count++;
                }
                System.out.println(count);
        }
}

这个输出多少?

第一题:0

第二题:0

第三题:死循环

再看下面的解析时需要知道浮点数的存储,以及int转float时的步骤(java浮点数剖析

一、首先看看2000000000的二进制

01110111  00110101  10010100  0(0000000)

括号内为转换成浮点数后要舍弃的尾部

转换成浮点数后

0  10011101  11011100 11010110 0101000
S    E          M(23位)

二、然后观察2000000000+64

01110111  00110101  10010100  0(1000000)

转换成浮点数

0  10011101  11011100 11010110 0101000

发现和2000000000的浮点存储一模一样

三、然后观察2000000000+65

01110111  00110101  10010100  0(1000001)

显然

01110111  00110101  10010100  0

01110111  00110101  10010100  0(1000001)
01110111  00110101  10010100  1

显然中间的数更接近下面的数,因此浮点化之后

0  10011101  11011100 11010110 0101001

比2000000000的浮点存储大1

因此前两个程序打印0就可以理解了(重点要知道怎么转化成浮点数,以及怎么舍弃尾部)

四、1的浮点表示

0  01111111  0000000 00000000 00000000

五、浮点数的加减运算

对阶:

  阶差位30

  故f++对f基本上没有影响

  因此会是死循环!!!

原文地址:https://www.cnblogs.com/qionghua520/p/4378989.html