我的理解是转换分为自动(非显式)转换和强制(显式)转换。对于精度无损失的话,用自动(非显式)转换,如果精度损失的话,用强制(显式)转换。 有损精度的代码是编译不过去的。对于这句话 : 把int或long转为float,都可能造成精度的损失。
你要看float分配几个字节来表示小数,几个分配来表示指数,这样你就清楚了。
当然不可能将32个字节都用来表示小数,所以有损精度的事情是有可能发生的(个人认为)

解决方案 »

  1.   

    sorry 更正上面的话
    当type1.MAX_VALUE > type2.MAX_VALUE 时type2 到type1的转换为自动,相反必须强制。否则代码编译不过去
      

  2.   


    class Casting {        public static void main(String arg[]){                int a=8,b=3,c;

                    c=(int)(a/b);                System.out.println(c);
    }
    } 上面的转换精度还是损失拉把!
    你说:有损精度的代码是编译不过去的。//你是要更正这句话把!你这句话:当type1.MAX_VALUE > type2.MAX_VALUE 时type2 到type1的转换为自动,相反必须强制。否则代码编译不过去  //这与我的理解一样的!抱歉,我对float的理解也不是很好!听说float他的小数位数最大是8位,double是16位。比如:System.out.println(2.0-1.1); 
    得到的结果不是0.9,而是0.8999999999999999 //有15个‘9’你说:你要看float分配几个字节来表示小数,几个分配来表示指数,这样你就清楚了。
    当然不可能将32个字节都用来表示小数,所以有损精度的事情是有可能发生的(个人认为)
    //我还是认为因为int没有小数,转为float后精度不会损失!
    //可以举例说明一下吗?望指教,谢!
      

  3.   

    System.out.println(Integer.MAX_VALUE);
    float f = Integer.MAX_VALUE;
    System.out.println(f);
      

  4.   

    对于int转float,我基本上懂拉!谢!我搜到下面的贴子,希望对其它人有帮助!从原理上来讲,任何一门语言对于浮点数的计算都是不精确的。因为现在的Computer都是基于二进制数来存储计算的。例如计算8+3时,Computer会转换为二进制的加法1000+11=1011,然后再转换为十进制数为11。这种算法对于整数来说是不会产生误差的(如果不超过计算范围);而对于浮点数计算有时就会产生误差。因为有的浮点数转换成为二进制时是一个无穷循环小数。例如十进制的0.4,转换成为二进制为0.0110011001100110....,这样,在0.4+0.3时就不能准确的算出是0.7,而是经过一些舍入处理才能得出正确结果,但经过多次运算误差产生的较大时,即使经过一些舍入处理也不能得到精确的结果了。我来重新理解一下上面的问题。转换分为自动(非显式)转换和强制(显式)转换。它与精度的损失无多大关系!比如int转float,精度在损失的情况下,它也可自动转换。
    //很多书上都没具体说明精度的损失与转换的关系,不知道我这样理解对不对当type1.MAX_VALUE > type2.MAX_VALUE 时
    type2转为type1时,自动转换!
    type1转为type2时,需要强制转换! 
    //这存在数据溢出的情况,但是不会影响程序的编译!
    如:
    System.out.println(Short.MAX_VALUE);
    byte s=(byte)(Short.MAX_VALUE);
    System.out.println(s);输出结果: 32767
               -1
    那是因为short最大值为1111111111111111  //2个字节16个1
    而byte只有一个字节,所以变量s 值为11111111 即为-1D 
    但不知道这样数据的溢出是否真的对JAVA程序没一点影响!望okwuzhijun兄指出错误!
      

  5.   

    从高到低才会损失精度!
    例如从float到int,从32-bits到16-bits,要砍掉多少
    位有效数字?从int到float一点精度都不会损失。//--------------
    int a=8,b=3,c;
    c=(int)(a/b);
    System.out.println(c);
    //---------------根本无关精度问题,int/int本来就是int,写成//--------------
    int a=8,b=3,c;
    c=a/b;
    System.out.println(c);
    //---------------
    也没问题,但是下面的代码肯定玩完float a=8.0,b=4.0;
    int c;
    c=(a/b);
    System.out.println(c);
      

  6.   


    你说:从int到float一点精度都不会损失看看下面把,System.out.println(Integer.MAX_VALUE);
    float f = Integer.MAX_VALUE;
    System.out.println(f);