黑马程序员技术交流社区
标题:
小问题,想不明白
[打印本页]
作者:
黑马刘杰
时间:
2013-2-25 10:02
标题:
小问题,想不明白
本帖最后由 黑马刘杰 于 2013-2-26 13:20 编辑
private static void foo() {
int a=1000000000;//没有越界
int num=0;
//a+10也不越界
for(float f=a;f<a+10;f++){
num++;
}
System.out.println(num);//这儿打印0
复制代码
我的num怎么会是0?
作者:
陈圳
时间:
2013-2-25 10:16
本帖最后由 陈圳 于 2013-2-25 10:19 编辑
package Day15;
class Test1
{
public static void main(String[] args)
{
int a=1000000000;//没有越界
int num=0;
//a+10也不越界
System.out.println(Integer.MAX_VALUE);
System.out.println(a);//
float f=a;
System.out.println(f);//这里打印
1000000000
f+=10;
System.out.println(f);
这里也打印 1000000000 说明for循环没有运行,他认为(f=a)==(f=a+10)我找一下这个原因
for(f=a;f<a+10;f++)//这个代码没有运行
{
System.out.println("num="+num);
num++;
}
System.out.println(num);//这儿打印0
}
}
复制代码
for循环没有运行,
System.out.println(f);
f+=10;
System.out.println(f);
结果是一样的,
作者:
黑马刘杰
时间:
2013-2-25 10:22
陈圳 发表于 2013-2-25 10:16
for循环没有运行,
System.out.println(f);
f+=10;
f是float类型,8字节存储啊,f是不可能越界的
作者:
胥文
时间:
2013-2-25 10:23
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);
作者:
陈圳
时间:
2013-2-25 10:32
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)这时就更实用了.
作者:
贾文泽
时间:
2013-2-25 10:40
private static void foo() {
int a=1000000000;//没有越界
int num=0;
//a+10也不越界
for(float f=a;f<a+10;f++){ //循环里的更新数不能定义为浮点数,
num++;
}
System.out.println(num);//这儿打印0
}
复制代码
循环里的更新数不能定义为浮点数,因为浮点数在计算机内部以IEEE754标准存储,他的这种编码导致计算机无法精确的存储每一个浮点数,
float f=a; 这里f=1.0E9 计算机无法精确的存储这个数,也就是说,f输出为1.0E9,其实在计算机中存储的f可能是很接近他的一个浮点数
所以当程序执行 f<1000000010 时,那1000000010很可能就是f在计算机中真正存储的数据,所以就会得到 f == 10000000010
作者:
许云龙
时间:
2013-8-17 21:06
您好,我的想法是for循环中的num++作用的只是局部变量,到最后的值在内存中会消失,你在for循环外面的打印只是徒劳,想获得值的话用while循环试试看
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2