Java中的加宽或自动类型转换;为什么会有精度损失?

时间:2018-12-13 21:29:22

标签: java casting precision

以该代码为例。

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?

1 个答案:

答案 0 :(得分:1)

从技术上讲,这里发生的不是loss of precision,而是使用integer division

让我们以ffloat f = i*9/5;

为例

由于乘法和除法运算符具有相同的优先级并且是左关联的,因此该语句等效于:float f = (i*9)/5;

由于i=419都是int类型的,因此结果值的类型也是int369)。因此,评估的下一步是369/5。由于两个操作数的类型均为int,因此/运算符的解释是使用整数除法,它会丢弃所有小数余数。由于369/5 = 73 + 4/5,表达式的计算结果为73,然后将其转换为float73.0并分配给f

d发生了非常类似的过程,除了73的最终转换是转换为double73.0

请注意,尽管我在评估中包括了中间步骤,但左缔合度对整数除法的使用没有影响。 float f = i*(9/5);产生f = 41.0