2つの数字の差の割合を計算するコードがあります-(oldNum - newNum) / oldNum * 100;
-両方の数字がdouble
sです。 oldNumが0の場合、何らかのチェック/例外処理を追加する必要があります。ただし、oldNumとnewNumの両方の値を0.0に設定してテストを実行すると、何も起こらずエラーがスローされなかったように実行が継続されました。このコードをint
sで実行すると、確実に算術ゼロ除算例外が発生します。 Javaがdouble
sになると無視するのはなぜですか?
ゼロによる除算の結果は、数学的に言えばndefinedであり、float/doubleで表現できます(NaN
-数字ではない)、しかし、そうではありません。基本的な意味で間違っています。
整数は特定の数値を保持する必要があるため、それらを処理するときにゼロによる除算でエラーがスローされる必要があります。
Doubleの格納方法は、intとはまったく異なります。 Javaが二重計算を処理する方法の詳細な説明については、 http://firstclassthoughts.co.uk/Java/traps/Java_double_traps.html を参照してください。浮動小数点数、特に Not a Number(NaN) の概念。
浮動小数点表現について詳しく知りたい場合は、 このドキュメント (Word形式、申し訳ありません)を読むことをお勧めします。それはあなたの理解に役立つかもしれない数のバイナリ表現を掘り下げます。
Java開発者はdoubleプリミティブ型とDouble
クラスについて知っていますが、浮動小数点演算を行っている間、彼らは_Double.INFINITY
_、NaN
、_-0.0
_およびそれらに関係する算術計算を管理するその他のルール。
この質問に対する簡単な答えは、ArithmeticException
をスローせず、_Double.INFINITY
_を返さないことです。また、false
自体がx
であっても、比較_x == Double.NaN
_は常にNaN
と評価されることに注意してください。
x
がNaN
であるかどうかをテストするには、メソッド呼び出しDouble.isNaN(x)
を使用して、指定された数値がNaNかどうかを確認する必要があります。これは、NULL
のSQL
に非常に近いです。
役に立つかもしれません。
ゼロで割った場合(0または0.00)
Doubleを0で除算すると、JVMはInfinityを表示します。
public static void main(String [] args){ double a=10.00; System.out.println(a/0); }
コンソール:Infinity
Intを0で除算すると、JVMは算術例外をスローします。
public static void main(String [] args){ int a=10; System.out.println(a/0); }
コンソール:_Exception in thread "main" Java.lang.ArithmeticException: / by zero
_
しかし、intを0.0で除算すると、JVMはInfinityを表示します。
public static void main(String [] args){ int a=10; System.out.println(a/0.0); }
コンソール:Infinity
これは、JVMがcast intをdoubleに自動的に入力するため、ArithmeticExceptionの代わりに無限大を取得するためです。