以该代码为例。
class Main {
public static void main(String[] args) {
int i = 41;
long l = i*9/5; //no explicit type casting required
float f = i*9/5; //no explicit type casting required
double d = i*9/5; //no explicit type casting required
double e = (double) i*9/5;
System.out.println("Int value "+i);
System.out.println("Long value "+l);
System.out.println("Float value "+f);
System.out.println("Double value "+d);
System.out.println("Double value cast "+e);
}
}
目标类型大于源类型,因此不需要显式强制转换,但是为什么会损失精度?为什么我不能将'd'和'f'设为73.8?
答案 0 :(得分:1)
从技术上讲,这里发生的不是loss of precision,而是使用integer division。
让我们以f
:float f = i*9/5;
由于乘法和除法运算符具有相同的优先级并且是左关联的,因此该语句等效于:float f = (i*9)/5;
由于i=41
和9
都是int
类型的,因此结果值的类型也是int
(369
)。因此,评估的下一步是369/5
。由于两个操作数的类型均为int
,因此/
运算符的解释是使用整数除法,它会丢弃所有小数余数。由于369/5 = 73 + 4/5
,表达式的计算结果为73
,然后将其转换为float
值73.0
并分配给f
。
d
发生了非常类似的过程,除了73
的最终转换是转换为double
值73.0
。
请注意,尽管我在评估中包括了中间步骤,但左缔合度对整数除法的使用没有影响。 float f = i*(9/5);
产生f = 41.0
。