- 締切済み
doubleについて
すみません、下記のコードで double ans5 = (7+32)/(double)5; System.out.println("(7+32)/5は" + ans5 + "です。"); 右辺のdoubleが何故つくのかわかりません。5はintでいいと思うのですが、出る答えdoubleなので左辺をdoubleで指定しますよね?ならば、出てくる答えも自然doubleになるのではないのでしょうか? よく割り算の場合、左辺はdoubleで右辺の割る部分もdoubleで指定してありますすが、そういう決まりなんですか? 一度、消して実行したところ、やはり、小数点以下は切り捨てられていました。そういうものだと、このコードは分かっても他に応用が利かないので、詳しい方、教えてください。 かなり初心者ですがよろしくお願いします。」
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- ssr-y6
- ベストアンサー率71% (5/7)
キャストの位置と演算結果の違いについては、以下のプログラムでわかると思います。 public class cast { public static void main(String args[]) { double Ans; Ans = (7 + 32) / (double)5; System.out.println("[1]演算の精度は精度の高いほうに合わせられる " + Ans); Ans = (7 + 32) / 5.0; System.out.println("[2]上と同じ " + Ans); Ans = (7 + 32) / 5f; System.out.println("[3]整数(5)を浮動小数点数に変換するときに誤差が出る " + Ans); Ans = (7 + 32) / 5.0f; System.out.println("[4]上と同じ " + Ans); Ans = (double)(7 + 32) / 5; System.out.println("[5]除算よりもキャストが優先なので一番上と同じ " + Ans); Ans = (7 + 32) / 5; System.out.println("[6]整数として演算した結果をdoubleに入れても小数部はなくなる " + Ans); Ans = (double)((7 + 32) / 5); System.out.println("[7]整数として演算した結果をキャストしても小数部はなくなる " + Ans); }; } 結果からわかるように、[1]と[2]、[3]と[4]の結果では誤差の出方がほんの少し違ってきますので、 それらの二つを混合して使うことは避ける(決り文句として片方の方法を使う)べきでしょう。
- ametsuchi
- ベストアンサー率31% (81/257)
Kanataさん、補足ありがとうございます。 「(32+7)/(double)5だと答えは7.8」これは勿論です。混合演算の規則どおりです。私も浮動小数点を扱って30年近くになりますから当然100も承知です。 「(32+7)/5」に対する説明のつもりでした。聊か説明が曖昧でしたね。
解説自体はametsuchi様のものでいいのですが、 (32+7)/(double)5だと答えは7.8になるはずですよ。 基本的に計算は高い方に合わせれられるので、 (32+7)/(double)5 = 39.0/5.0になります。 ではでは☆
- ametsuchi
- ベストアンサー率31% (81/257)
JAVAだろうが、C++だろうが、Cだろうが、Fortranだろうが全く同じで、左辺のタイプに関係なく、右辺の計算途中で、整数同士なら整数タイプの演算になります。 7+32は=39で問題なし。問題は39/5です。39も5も整数ですから、一旦右辺の値は=7になります。これをdoubleにすると、=7.0 右辺の(double)は勿論Castです。(double)5ではなく、5.0と書けば問題ないはずです。 普通、実数値の定数は「5」などと書かずに「5.0」、「5.0f」などと書きます。 実はJAVAは経験がないので自信がないのですが、C++とこの辺は変わらんはず。
お礼
ありがとうございました。