【问题标题】:why explicit type casting required from double to float but not from int to byte?为什么需要从 double 到 float 而不是从 int 到 byte 的显式类型转换?
【发布时间】:2015-04-06 08:10:33
【问题描述】:

考虑以下语句:

byte by = 5; //works fine

literal '5' 是 int 类型,并且小到可以放入 byte 类型的变量中。编译器在这里进行隐式类型转换(从 int 到 byte)。

现在考虑以下场景:

float fl = 5.5;    //compilation error

literal '5.5' 是 double 类型,也小到可以放入变量 类型浮动。为什么我们需要像这样显式类型转换:

float fl = (float) 5.5;   //works fine

为什么编译器在浮点数的情况下不为我们进行转换?

【问题讨论】:

    标签: java casting


    【解决方案1】:

    在整数版本中,编译器知道所有数字5 中的数据可以存储在byte 中。没有信息丢失。对于浮点值,情况并非总是如此。例如,0.1f 不等于 0.1d

    现在,对于您给出的示例,十进制值 5.5 floatdouble 中都精确表示,因此您可以争辩说,在这种情况下,不会丢失任何信息- 但是语言规范必须使它有效是很奇怪的:

    float f = 5.5;
    

    但这无效:

    float f = 5.6;
    

    语言规范很乐意谈论一个数字是否在float/double 的范围内(尽管那个并不像你想象的那么简单)但是当它关于文字是否可以准确表示,我认为它永远不会详细说明。

    【讨论】:

    • 加一,简而言之5.1 != 5.1f5.1 - 5.1f == 9.536743128535363E-8
    • 谢谢乔恩,明白了 :) 拯救了我的一天!
    • @PeterLawrey 你能详细说明你的评论吗?
    • @maximus335 5.1 使用 64 位值,并且比仅使用 32 位的 5.1f 更准确地接近 5.1。这意味着虽然值看起来相似,但它们并不相同。参考文献5.5 在doublefloat 中精确表示,这就是我选择不同值的原因。 ;)
    • 如果我正在设计一种语言,我会允许浮点文字包含一个后缀,以指示预期的精度。如果pf 后缀表示“精确浮点”,则值1111111.1xf 将被拒绝,但111111.125xf 将被接受。有时程序员打算让编译器使用与某个数字最接近的可表示值,有时程序员打算让编译器使用确切的数字并且想知道它是否不能。我希望语言能让程序员表达这样的意图。
    【解决方案2】:

    简单的答案是,因为规范是这么说的(整数类型的编译时常量可以分配给更小的类型,只要它们适合)。

    但是,对于浮点数,与其说是确定常数是否适合,不如说是随之而来的精度损失。例如。将 1.23456789123 分配给 double 是可以的,但分配给 float 则不行。但是,在这种情况下,至少对于某些程序员来说,为什么并不那么明显。当 some 浮点常量起作用而其他浮点常量不起作用并且原因不像整数类型那样清楚(其中限制通常是大多数人的第二天性)时,我绝对会认为这是一个惊喜)。

    请注意,即使使用双打,有时也会丢失信息。您可以根据需要使常量尽可能精确,但您不会总是得到您在变量中声明的确切值。

    【讨论】:

    • 如果标准允许将双字面值分配给 float 值,恕我直言,这种行为会比例如double oneTenthKindaSorta = 1.0f/10.0f;long whatsThis = Math.round(123456789012345L); [对这些有什么预测]?
    【解决方案3】:

    同意乔恩,但是,我想补充一点

    byte by = 5;     //works fine until the number is less than 128 
    

    这是因为一个字节最多只能容纳 -128 到 127。一旦您尝试输入大于 127 的数字,您将得到与将双精度值存储到浮点数时相同的错误。

    byte by =  128; //compilation error
    

    因此,为了同意丢失转换数据,您需要执行显式转换。

    byte by = (byte) 128; // work fine
    

    【讨论】:

      【解决方案4】:

      也许 Java 允许将 int 类型的字面量隐式缩小转换为 shortbyte,但对于将字面量 double 值转换为 float 时不这样做的最重要原因是Java 包含 float 文字,但不允许 byteshort 类型的文字。

      就个人而言,我真的不喜欢 Java 的数值转换规则,但允许将整数常量存储到 shortbyte 使得这些类型至少在某种程度上可以忍受。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多