Java允许int到float的隐式转换。为什么?
在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;
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代码>(其含义可能与程序员的意图不同)。