このコードブロックの場合:
int num = 5;
int denom = 7;
double d = num / denom;
の値はd
です0.0
。キャストすることで強制的に動作させることができます:
double d = ((double) num) / denom;
しかし、正しいdouble
結果を得る別の方法はありますか?何が起こるかを知っているプリミティブをキャストするのは好きではありません。
このコードブロックの場合:
int num = 5;
int denom = 7;
double d = num / denom;
の値はd
です0.0
。キャストすることで強制的に動作させることができます:
double d = ((double) num) / denom;
しかし、正しいdouble
結果を得る別の方法はありますか?何が起こるかを知っているプリミティブをキャストするのは好きではありません。
double num = 5;
それはキャストを回避します。ただし、キャスト変換は明確に定義されていることがわかります。推測する必要はありません。JLSを確認するだけです。intからdoubleへの変換は拡大変換です。§5.1.2から:
プリミティブ変換を拡張しても、数値の全体的な大きさに関する情報は失われません。
[...]
intまたはlong値をfloatに変換したり、long値をdoubleに変換したりすると、精度が低下する可能性があります。つまり、値の最下位ビットの一部が失われる可能性があります。この場合、結果の浮動小数点値は、IEEE 754の最も近い丸めモード(§4.2.4)を使用して、整数値の正しく丸められたバージョンになります。
5は正確にdoubleとして表現できます。
プリミティブのキャストの何が問題になっていますか?
なんらかの理由でキャストしたくない場合は、
double d = num * 1.0 / denom;
何が起こるかわからないプリミティブをキャストするのは好きではありません。
プリミティブをキャストすることに不合理な恐怖を感じるのはなぜですか? int
を にキャストしても、悪いことは何も起こりませんdouble
。それがどのように機能するのかわからない場合は、Java 言語仕様で調べてください。int
toのキャストdouble
は、拡張プリミティブ変換です。
分子の代わりに分母をキャストすることで、余分な括弧のペアを取り除くことができます。
double d = num / (double) denom;
あなたは明示的にそれをしないかもしれませんが、それは起こります。
ここで、正確な値を取得しようとする方法がいくつかありdouble
ます ( wherenum
とdenom
はint
型であり、もちろんキャストを使用します)-
double d = (double) num / denom;
double d = ((double) num) / denom;
double d = num / (double) denom;
double d = (double) num / (double) denom;
だがしかしdouble d = (double) (num / denom);
double d = num * 1.0 / denom;
double d = num / 1d / denom;
double d = ( num + 0.0 ) / denom;
double d = num; d /= denom;
でもそうじゃdouble d = num / denom * 1.0;
ないdouble d = 0.0 + ( num / denom );
今、あなたが尋ねているなら - どちらが良いですか? 明示的な?または暗黙の?
さて、ここで率直な答えをたどらないようにしましょう。単純に覚えておいてください - 私たちプログラマーは、ソース内のサプライズやマジックが好きではありません。そして、私たちはイースターエッグが大嫌いです。
また、追加の操作によってコードがより効率的になるわけではありません。右?
次のようなものを使用します。
double step = 1d / 5;
(1d は double へのキャスト)