- ベストアンサー
javaで1.8x10の308乗÷ー1.8x10の308乗割り算の計算方法
- java初心者が1.8x10の308乗÷ー1.8x10の308乗割り算をする方法を教えてください。
- 実行結果はNaN(演算不可能)、Infinity(無限大)となります。
- javaのプログラムで割り算を行う際には、double型などの適切なデータ型を使用して計算する必要があります。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
理解しやすくするために、 System.out.println((num1*z)/(num2*z)); の前に System.out.println(num1*z); System.out.println(num2*z); の2行を入れましょう。これで、何を何で割ろうとしているのかがわかるようになります。 次に、 System.out.println(Double.MAX_VALUE); という1行をどこかに入れてみてください。結果、 1.7976931348623157E308 と表示されると思います。 つまり、 1.8×10^308はdoubleの最大値をオーバーしてしまうので、1.8 1.8のときはnum1とnum2にはInfinityが代入されます。∞÷∞は計算できないので、NaN(Not a Number)が表示されます。 次に、-1.8 -1.8のときは同様にnum1とnum2には-Infinityが代入されます。(-∞)÷(-∞)も計算できないのでNaNです。 最後に、1.8 0のときはnum1にInfinity、num2に0が代入されます。このとき∞÷0になりますが、javaでは分子が0でなく、分母が0のときには便宜上Infinityと計算されます。(もちろん数学的には0で割ってはいけないのですが)よってInfinityが表示されます。(もちろんnum1が-Infinityなら答えは-Infinityです) ちなみに0 0だとこれは計算できないとしてNaNになります。
その他の回答 (2)
- simple-dev
- ベストアンサー率30% (3/10)
Javaのdouble型の最大値は、1.7976931348623157E308です。(Double.MAX_VALUEで定義されています) 従って、「1.8x10^308」は、ぎりぎりのところでオーバフローしているのではないでしょうか? No.2でも、言われているように、BigDecimalを使うのがいいのではと思います。
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
10e308 は、おそらくdouble の表現範囲を超えています BigDecimal クラスを使ってみてはどうでしょうか
お礼
ご返事遅くなり本当に申し訳ありません。 本当にありがとうございます。 説明が大変に丁寧で恐縮してしまいます。 そして大変に詳しくわかりやすいご説明ありがとうございました。まだよくわからないのでよく読んでみます。