java - java中的浮点到长类型转换问题

标签 java typecast-operator

示例 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/

相关文章:

java - 在 Hibernate 中绕过 GeneratedValue(合并不在数据库中的数据?)

java - 如何从 Native SQL 读取具有多个字段的 SQL

c - 将一种类型转换为另一种 C 类型的类型转换警告

java - 如何检查ResultSet是否返回结果?

java - 我如何随机调用一个方法在java中运行?

java - SQLite 一列到数组

c++ - 使用 char* 运算符的随机输出

c++ - 为什么这不对转换构造函数进行隐式转换?

c++ - 根据数字模板参数有条件地编译转换运算符