A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 黑马刘杰 中级黑马   /  2013-2-25 10:02  /  2217 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 黑马刘杰 于 2013-2-26 13:20 编辑
  1. private static void foo() {
  2.                 int a=1000000000;//没有越界
  3.                 int num=0;
  4.                 //a+10也不越界
  5.                 for(float f=a;f<a+10;f++){
  6.                     num++;
  7.                 }
  8.                 System.out.println(num);//这儿打印0

复制代码
我的num怎么会是0?

评分

参与人数 1技术分 +1 收起 理由
Rancho_Gump + 1

查看全部评分

6 个回复

倒序浏览
本帖最后由 陈圳 于 2013-2-25 10:19 编辑
  1. package Day15;
  2. class Test1
  3. {
  4.         public static void main(String[] args)
  5.         {
  6.                 int a=1000000000;//没有越界
  7.         int num=0;
  8.         //a+10也不越界
  9.         System.out.println(Integer.MAX_VALUE);
  10.         System.out.println(a);//
  11.         float f=a;
  12.         System.out.println(f);//这里打印
  13. 1000000000
  14.         f+=10;
  15.         System.out.println(f);
  16. 这里也打印 1000000000  说明for循环没有运行,他认为(f=a)==(f=a+10)我找一下这个原因
  17.         for(f=a;f<a+10;f++)//这个代码没有运行
  18.         {
  19.                 System.out.println("num="+num);
  20.             num++;
  21.         }
  22.         System.out.println(num);//这儿打印0
  23.         }
  24. }
复制代码
for循环没有运行,
System.out.println(f);
        f+=10;
System.out.println(f);
结果是一样的,
回复 使用道具 举报
陈圳 发表于 2013-2-25 10:16
for循环没有运行,
System.out.println(f);
        f+=10;

f是float类型,8字节存储啊,f是不可能越界的
回复 使用道具 举报
int a =1000000000;
int num =0;
float f =a;
float x = a+10;
System.out.println(x);
System.out.println(f-(a+10));//此处等于0,你自己可以验证一下
System.out.println(f);
回复 使用道具 举报
int i=16000000;//<17000000的时候赋值输出正确.
                //System.out.println((int)Float.MAX_VALUE);
                float f=i;
                System.out.println(f);
                f=i+1;
                System.out.println(f);
a<17000000的时候赋值f输出正确.我试了一下,大于17000000的时候f输出时都是
1.7E7
f++;
1.7E7
他是按照这个十六进制位来换算成二进制计算结果的.所以他的十六进制位没有改变,他也就认为值没有改变
这么大的数,估计要一次累加上千上万,才会有作用.而for 循环需要循环那么多次时,早就累死了,while(flgs)这时就更实用了.
回复 使用道具 举报
  1. private static void foo() {
  2.     int a=1000000000;//没有越界
  3.     int num=0;
  4.     //a+10也不越界
  5.     for(float f=a;f<a+10;f++){  //循环里的更新数不能定义为浮点数,
  6.                 num++;
  7.     }
  8.     System.out.println(num);//这儿打印0
  9. }
复制代码
循环里的更新数不能定义为浮点数,因为浮点数在计算机内部以IEEE754标准存储,他的这种编码导致计算机无法精确的存储每一个浮点数,
float f=a;    这里f=1.0E9      计算机无法精确的存储这个数,也就是说,f输出为1.0E9,其实在计算机中存储的f可能是很接近他的一个浮点数
所以当程序执行 f<1000000010  时,那1000000010很可能就是f在计算机中真正存储的数据,所以就会得到   f == 10000000010   

评分

参与人数 1技术分 +1 收起 理由
Rancho_Gump + 1

查看全部评分

回复 使用道具 举报
您好,我的想法是for循环中的num++作用的只是局部变量,到最后的值在内存中会消失,你在for循环外面的打印只是徒劳,想获得值的话用while循环试试看
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马