我们会通过隐式转换来放松精度

时间:2013-10-20 15:35:18

标签: java implicit-conversion implicit

在Java过去的考试试卷中有一个问题让我兄弟:

  

通过隐式转换原始数据类型,您可能会丢失精度并获得不正确的结果。

     

A,B,False

     

答案的关键是A:True

我认为既不会失去精确度也不会得到不正确的结果。我知道显式转换会丢失精度并得到不正确的结果,但不会隐含。

例如:

int i = 9;

short s = 3;

i = s; // implicit conversion, neither loose 
      //precision nor incorrect results

s = i; // compile error, do we call this implicit conversion? 
       //if yes, then the answer to question 3 is True, 
       //but I don't think this is an implicit conversion, 
       //so I think answer is false.   

作为笔记上的状态:

  

隐式类型转换:程序员不会尝试转换类型,而是在某些情况下系统会自动转换类型。

有人可以建议吗?

非常感谢。

3 个答案:

答案 0 :(得分:6)

答案= A

    float f = Long.MAX_VALUE;
    System.out.println(Long.MAX_VALUE);
    System.out.printf("%.0f", f);

输出

9223372036854775807
9223372036854776000

答案 1 :(得分:3)

在某些情况下,编译器将允许隐式转换,但您仍可能失去精度。例如:

long a = Long.MAX_VALUE;  // 9223372036854775807
double b = a;             // 9223372036854776000

有关详细信息,请参阅JLS

答案 2 :(得分:1)

赋值运算符中存在隐式转换。这些可能会失去精度或导致溢出。对于常规分配,只有在编译器知道它是安全的时才会发生隐式转换。它仍然会失去精度,但不会导致溢出。

e.g。

final int six = 6;
byte b = six; // compiler uses constant propagation and value is in range.

int five = 5;
byte b2 = five; // fails to compile

double d = 5.5;
five += d; // compiles fine, even though implicit conversion drops the 0.5
// five == 10 not 10.5

five += Double.NaN; // five is now 0 ;)