范例1:
public class Test {
public static void main(String args[]){
long l1 =8589934592L;
float f1= l1;
long l2= (long)f1;
System.out.println("Input long::"+l1);
System.out.println("Float value::"+f1);
System.out.println("Typecasted value::"+l2);
}
}
Output of for first class:
Input long::8589934592
Float value::8.5899346E9
Typecasted value::8589934592
范例2:
public class Test {
public static void main(String args[]){
long l1 =6788819226L;
float f1= l1;
long l2= (long)f1;
System.out.println("Input long::"+l1);
System.out.println("Float value::"+f1);
System.out.println("Typecasted value::"+l2);
}
}
Output of for second class:
Input long::6788819226
Float value::6.7888195E9
Typecasted value::6788819456
类型转换未正确进行。这两类都有不同的行为。
为什么示例2在类型转换后具有不同的值。请让我知道原因?
最佳答案
Float没有足够的精度来精确编码此数字。
如果您使用double,它将起作用:
public class Test {
public static void main(final String args[]) {
long l1 = 6788819226L;
double f1 = l1;
long l2 = (long) f1;
System.out.println("Input long::" + l1);
System.out.println("Double value::" + f1);
System.out.println("Typecasted value::" + l2);
}
}
输出:
Input long::6788819226
Double value::6.788819226E9
Typecasted value::6788819226
您可以阅读https://docs.oracle.com/javase/specs/jls/se7/html/jls-4.html#jls-4.2.3来了解float的确切限制。
为了给出一个近似值,最大2 ^ 24的整数将被精确地保存在float中,之后它可以是一个近似值(或精确的,取决于数字)。对于双打,最高为2 ^ 53。
您的第一个示例完全有效的原因是8589934592是2的幂,对于2的幂,其近似值等于数字(如果您阅读了规格说明,您将会理解这一点)。