需要在Java中解释。哪种方式最好?

时间:2017-11-12 22:48:33

标签: java casting

我有以下代码:

double d = 23d;
byte b = 52;

int result;

我正在尝试将d + b的结果存储在result中,为了做到这一点我必须施展,但是我找到了两种方法来做到这一点,我不知道是什么不同的是。

//First method
result = (int) d + b;

//Second Method
result = (int) (d+b);

有什么区别?

由于

4 个答案:

答案 0 :(得分:4)

在第一种情况下,d已投放到int,然后添加到b

result = (int) d + b;
// is also equivalent to
result = ((int) d) + b;

这是可行的,因为添加bytedouble可以在没有任何演员的情况下完成。另一方面,int result = (int) b + d会失败,因为这会导致int被添加到double,从而产生double,无法放入int

在第二种情况下,首先完成添加,然后将结果转换为int

答案 1 :(得分:4)

第一个方法仅转换第一个操作数,在本例中为d。第二种方法会投射db之和的结果。

答案 2 :(得分:3)

对于大多数值,两个表达式都将返回相同的值。但是,请看一下这段代码,它将说明不同之处:

double d = 1 / (1 - (0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1)); // equal to 9.007199254740992E15
byte b = 1; 

System.out.println((long) d + b); // prints 9007199254740993
System.out.println((long) (d + b)); // prints 9007199254740992

现在发生了什么?

  • 在第一个表达式中,d首先转换为long,然后添加到b
  • 在第二个表达式中,d + b计算为double值,然后转换为long

为什么重要?

我没有随机选择d。这是d + 1是整数但不能表示为double的数字,因为它是一个很大的数字而double的精度有限。因此,对于此特定数字d + 1 == d!但是,long对于小到足以容纳64位的所有整数具有无限精度。因此,在计算d之前将long转换为d + 1会为我们提供没有精度误差的实数和。

PS:我使用long代替int,因为此数字不适合int和woud溢出。这两个表达式仍会返回两个不同的结果,但这会使我的观点不那么明确。

答案 3 :(得分:0)

Thxs!以下对我的理解的解释可能对你有帮助。

第一种方法简化:
b被隐式转换为double并添加到d。然后生成double值并分配一个内存来存储这个双倍值,这个值更大。最后,转换为此值会使结果为int。

double d1 = d + b;
result = (int) d1;  

第二种方法简化:
第一个b被隐式转换为double并添加到d然后将结果值转换为byte。结果,它分配一个存储器来存储相对较低的字节值。最后,将此字节值隐式转换为int,并将结果生成为int。

byte b1 = (byte)(d + b);
result =  b1;

因此我们得出结论第二种方法是最好的,因为它分配的内存空间低于第一种方法。