我有以下代码:
double d = 23d;
byte b = 52;
int result;
我正在尝试将d + b
的结果存储在result
中,为了做到这一点我必须施展,但是我找到了两种方法来做到这一点,我不知道是什么不同的是。
//First method
result = (int) d + b;
//Second Method
result = (int) (d+b);
有什么区别?
由于
答案 0 :(得分:4)
在第一种情况下,d
已投放到int
,然后添加到b
result = (int) d + b;
// is also equivalent to
result = ((int) d) + b;
这是可行的,因为添加byte
和double
可以在没有任何演员的情况下完成。另一方面,int result = (int) b + d
会失败,因为这会导致int
被添加到double
,从而产生double
,无法放入int
在第二种情况下,首先完成添加,然后将结果转换为int
。
答案 1 :(得分:4)
第一个方法仅转换第一个操作数,在本例中为d
。第二种方法会投射d
和b
之和的结果。
答案 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;
因此我们得出结论第二种方法是最好的,因为它分配的内存空间低于第一种方法。