我的理解是转换分为自动(非显式)转换和强制(显式)转换。对于精度无损失的话,用自动(非显式)转换,如果精度损失的话,用强制(显式)转换。 有损精度的代码是编译不过去的。对于这句话 : 把int或long转为float,都可能造成精度的损失。
你要看float分配几个字节来表示小数,几个分配来表示指数,这样你就清楚了。
当然不可能将32个字节都用来表示小数,所以有损精度的事情是有可能发生的(个人认为)
你要看float分配几个字节来表示小数,几个分配来表示指数,这样你就清楚了。
当然不可能将32个字节都用来表示小数,所以有损精度的事情是有可能发生的(个人认为)
当type1.MAX_VALUE > type2.MAX_VALUE 时type2 到type1的转换为自动,相反必须强制。否则代码编译不过去
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后精度不会损失!
//可以举例说明一下吗?望指教,谢!
float f = Integer.MAX_VALUE;
System.out.println(f);
//很多书上都没具体说明精度的损失与转换的关系,不知道我这样理解对不对当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兄指出错误!
例如从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);
你说:从int到float一点精度都不会损失看看下面把,System.out.println(Integer.MAX_VALUE);
float f = Integer.MAX_VALUE;
System.out.println(f);