2012-08-10 80 views
6

在Java中,我们可以将int转换为隐式浮动,这可能会导致精度损失,如下面的示例代码所示。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 

什么是落后使诚信的隐式转换浮动的原因,当有精度损失?

+0

重复http://stackoverflow.com/questions/11183980/why-does-c-sharp-allow-an-implicit-conversion-from-long-to-float-when-this-co – 2012-08-10 20:02:51

+0

@ AaronKurtzhals:这个问题涉及不同的语言。 – Wug 2012-08-10 20:04:07

回答

6

你可能想知道:

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

而你当然有一个好点。但是语言设计者认为,如果目标类型的范围足够大,那么允许隐式转换,即使可能会失去精度。请注意,这是范围这是重要的,而不是精度。 float的范围比int更大,所以它是一个隐式转换。

Java specification说以下内容:

int或长值的扩大转换浮动,或长值加倍的,可能导致精度的损失 - 也就是说,其结果可能失去一些价值的最低有效位。在这种情况下,得到的浮点值将是整数值的正确舍入版本,使用IEEE 754最近邻舍模式。

+0

32位'float'被认为比64位'long'更宽吗? – 2012-08-10 21:10:48

+2

@PeterLawrey:浮动范围为-3.4e + 38至3.4e + 38(大约)。长期有-9.2e18到-9.2e18的范围。由于浮动范围较大,因此范围较宽。 – 2012-08-10 21:19:22

+0

那可能就是这个想法。我遇到的问题是,当你将一个'long'传递给一个偶然带有'float'的方法时,它可以将64位精度转换为24位:P – 2012-08-11 06:20:53