示例 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 中,之后它可以是近似值(或精确值,具体取决于数字)。对于 double ,最多为 2^53。
您的第一个示例完全有效的原因是因为 8589934592 是 2 的幂,其近似值等于该数字(如果您阅读规范,您就会理解这一点)。
关于java - java中的浮点到长类型转换问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35811980/