Java允许int到float的隐式转换。为什么?

Java允许int到float的隐式转换。为什么?,java,Java,在Java中,我们可以隐式地将int转换为float,这可能会导致精度损失,如下面的示例代码所示 public class Test { public static void main(String [] args) { int intVal = 2147483647; System.out.println("integer value is " + intVal); double doubleVal = intVal;

在Java中,我们可以隐式地将int转换为float,这可能会导致精度损失,如下面的示例代码所示

public class Test {
    public  static void main(String [] args) {
        int intVal = 2147483647;
        System.out.println("integer value is " + intVal);
        double doubleVal = intVal;
        System.out.println("double value is " + doubleVal);
        float floatVal = intVal;
        System.out.println("float value is " + floatVal);
        }
}
输出是

integer value is 2147483647
double value is 2.147483647E9
float value is 2.14748365E9

当精度降低时,允许将int隐式转换为float的原因是什么?

您可能想知道:

当信息丢失时,为什么这是一种隐式转换?这不应该是一个显式转换吗

你当然有一个很好的观点。但是语言设计者决定,如果目标类型的范围足够大,则允许隐式转换,即使可能会损失精度。请注意,重要的是范围,而不是精度。浮点数的范围大于int,因此它是一种隐式转换

报告说:

将int或long值扩大到float,或将long值扩大到double,可能会导致精度损失—也就是说,结果可能会丢失一些值的最低有效位。在这种情况下,生成的浮点值将是整数值的正确四舍五入版本,使用IEEE 754四舍五入至最近模式


将整数类型转换为使用相同位数的浮点类型可能会导致精度损失,但会自动完成。
“精度损失”意味着一些不太重要的数字可能变为零,但最重要的数字和数字大小将保持不变。回想一下,float只有大约7位小数精度。例如,将整数123456789转换为浮点123456700.0会显示精度损失。

重复@AaronKurtzhals:这个问题涉及另一种语言。知道为什么32位
浮点
被认为比64位
宽吗?@PeterLawrey:float的范围是-3.4e+38到3.4e+38(大约)。long的范围为-9.2e18至-9.2e18。因为浮动范围更大,所以它更宽。这可能是我们的想法。我的问题是,当你把一个
long
传递给一个采用
float
的方法时,它会意外地将64位精度转换为24位:PSo,这是否意味着只有在转换过程中失去范围(宽度)而不是精度时才需要显式强制转换?@PeterLawrey:Java想要一个简单的“排名”并允许低级别类型的所有内容隐式转换为高级别类型的任何内容。这个决定迫使许多(不幸的)其他决定,例如让编译器拒绝
float f=1.0/10.0(如果允许的话,它将有一个完全符合程序员意图的合理含义),同时允许最可能错误的
双d=1.0f/10.0f(其含义可能与程序员的意图不同)。