黑马程序员技术交流社区

标题: 关于类型转换的问题 [打印本页]

作者: 一帆风顺    时间: 2012-9-17 09:50
标题: 关于类型转换的问题
本帖最后由 王博 于 2012-9-18 07:27 编辑

public class Convert
{
        public static void main(String[] args)        {
                int numi1 = 2,numi2 = 3;
                System.out.println(numi1/numi2);
                System.out.println((float)numi1/numi2);
                int numi3 = 999999999;
                float numf1;
                numf1 = numi3;
                System.out.println((int)numf1);
        }   
}

给的输出结果是
0
0.6666667
1000000000

前两个的结果知道,第三个的结果是怎么来的啊?是通过进位么?那怎么进的啊?
作者: 杨建峰    时间: 2012-9-17 15:09
float 精度不高, 代码是先将 INT 强制转换成 FLOAT ,再赋值, 转换后 9.99999999 * E9 ,
然后 ,再显示转换后 , 变成 100000000 ; 类似于 1.0 打印后显示 0.999999998 ,什么
的这种。 使用 DOUBLE 进行转换就会显示正确结果。 已经用实例自己试过了,不过还是头大
,讲错了不要见怪。
作者: 宫明星    时间: 2012-9-17 15:31
本帖最后由 宫明星 于 2012-9-17 15:51 编辑

我试了下,楼主代码打错了好几个println打错字pintln
float打错了flout。

最后一个不加int转换的话输出的是1.0E9 说明在numf1 = numi3赋值的过程中已经把
999999999转换成了1000000000.
  1. public class Convert
  2. {
  3.         public static void main(String[] args)        
  4.         {
  5.                 int n = 999999999;
  6.                 float f;
  7.                 f = n;
  8.                 System.out.println((float)n);
  9.                 System.out.println(f);
  10.                 System.out.println((int)f);
  11.         }   
  12. }
复制代码
输出是1.0E9,1.0E9,1000000000
该是int型转换float造成的。
具体原因我再找找。
这次我也学到了点东西

自己找了很久,发现有个说法可能靠谱:
如果一个数路够大,因为浮点在java中占32位,其中第一位是符号位,当数足够大的时候,分数部分最先损失,然后是整数部分。
作者: 赵家阳    时间: 2012-9-17 15:46
我也不理解,自己试验,还是不行!不过,楼主的代码写错了! System.out.pintln(numi1/numi2);         应该是println
System.out.pintln((flout)numi1/numi2);         应该是float
希望以后多细心点!



作者: 一帆风顺    时间: 2012-9-18 07:21
写错的地方虚心接受,问题已经明白,谢谢大家




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2