2017-11-12 5 views
2

私は次のコードを持っている:「私はresultd + bの結果を格納しようとしていますし、私はそれを行うためにキャストする必要があり、しかし、私はそれを行うには、2つの方法を発見したと私はドンJavaでのキャストの説明が必要です。どの方法が最高ですか?

double d = 23d; 
byte b = 52; 

int result; 

をその違いが何であるか知っている。

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

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

どういう違いがありますか?

おかげで最初のケースで

+1

キャストなしで 'int'に追加することができます(拡大変換)。最初の例は' d'を 'int'に変換し、' b'を追加します(結果として 'int' )。 2番目の例は、 'd'と' b'を加算して 'double'を生成します(' int'にキャストします)。 –

+1

あなたのケースでは「ベストキャスト」はありません。あなたはどんな振る舞いをしているのですか? –

答えて

4

は、dintにキャストし、次にこれがbyteの追加などが可能であるとdoubleは任意キャストすることなく行うことができるb

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

に添加されます。一方、int result = (int) b + dは、doubleintが追加された結果、doubleになり、intにすることはできません。第2のケースで


、加算が最初に行われ、その結果は、intにキャストされます。

4

最初のメソッドは最初のオペランドのみをキャストします。この場合はdです。第2の方法は、dbの合計の結果をキャストします。

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 

今、何が起こったのか?最初の式で

  • dlong最初に変換され、次いで第二の発現、d + bb
  • に追加さdouble値として算出し、次いでlong
に変換されます。

なぜ重要ですか?

ランダムにdを選択しませんでした。これは、d + 1が整数である数値ですが、数値が大きいためdoubleの精度が限られているため、doubleとして表すことはできません。その結果、この特定の番号d + 1 == d!しかし、longは、64ビットに収まるのに十分小さいすべての整数に対して無限の精度を持っています。したがって、d + 1を計算する前にdlongと変換すると、精度の誤差がなくなります。

PS:この数はintとwoudオーバーフローに収まらないので、私はlongの代わりintを使用。2つの表現はまだ2つの異なる結果を返すだろうが、それは私の主張をあまり明確にしないだろう。

0

Thxs!私の理解の説明の下であなたを助けるかもしれません。

第一の方法の簡素化:
Bは、暗黙的にdoubleに変換し、Dに追加されます。結果としてdouble値を生成し、最初にこのdouble値を格納するためのメモリを割り当てます。最後に、この値にキャストすると結果はintになります。

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

第2の方法の簡素化:
最初のBは、暗黙的にdoubleに変換され、バイトに得られた値を鋳造次いでDに添加します。その結果、比較的小さいこのバイト値を格納するためにメモリを割り当てます。最後に、このバイト値は暗黙的にintに変換され、intとして結果を生成します。

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

だから我々はそれが最初の方法よりも下位のメモリ空間を割り当てられるため第2の方法は、最高の1であると結論付けています。

+0

このレベルのメモリスペースは実際にはごくわずかです。 – nicovank

関連する問題