在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.
作为笔记上的状态:
隐式类型转换:程序员不会尝试转换类型,而是在某些情况下系统会自动转换类型。
有人可以建议吗?
非常感谢。
答案 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 ;)