范例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的幂,其近似值等于数字(如果您阅读了规格说明,您将会理解这一点)。

10-07 16:01