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

时间:2016-03-05 08:39:12

标签: java typecast-operator

示例1:

$params['newOrderStatus']->id

示例2:

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在类型转换后具有不同的值。请让我知道原因?

2 个答案:

答案 0 :(得分:1)

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以了解浮动的确切限制。 为了给出近似值,最多2 ^ 24的整数将精确保存在float中,之后它可以是近似值(或者精确,取决于数字)。对于双打,这最多可达2 ^ 53。

你的第一个例子完全正常工作的原因是因为8589934592是2的幂,其近似值等于数字(如果你阅读规范,你会理解这一点)。

答案 1 :(得分:0)

你得到的所有结果几乎相同,但如果你不熟悉使用1E值的科学记数法,它们可能看起来很不一样。请注意,浮点表示中的数字值之间存在E

在数字格式中,6.7888195E9表示6.7888195 * 10^9,与6788819226大致相同,但精度较低。在float类型中,它无法提供更多详细信息,因为您的数字大于float类型变量可以存储在其中的最大数量。

尝试使用较小的数字,float可以存储所有数字而不会丢失任何精度:

    long l1 =8589944L;
    float f1= (float) l1;
    long l2= (long)f1;
    System.out.println("Input long::"+l1);
    System.out.println("Float value::"+f1);
    System.out.println("Typecasted value::"+l2);

您会注意到结果是:

    Input long::8589944
    Float value::8589944.0
    Typecasted value::8589944

你看起来很熟悉。这表明示例中浮点值的表示使用E表示法来表示它是一个大数字,这表示它可能会丢失一些精度。当我们以指数形式编写数学术语时,数字通常很大,我们倾向于更少关注它们的小值。

类型float提供的精度较低,因为float具有较少的位来存储数字。较少的位意味着它使用较少的内存但与long相比只能具有有限的精度。 longfloat使用更多位(计算机内存中的1和0),如果以二进制数long的形式使用,则1s和{{1}而不是0s,这就是为什么它被称为float

在Java中,long使用64位,long使用32位。更多详情请见here

我希望这可以帮助您了解正在发生的事情。