2 つの数値のパーセンテージの差を計算するコードがあります - (oldNum - newNum) / oldNum * 100;- 両方の数値がdoubles です。oldNum が 0 の場合、何らかのチェック/例外処理を追加する必要があると予想していました。ただし、oldNum と newNum の両方の値を 0.0 にしてテストを実行すると、何も起こらなかったかのように実行が続行され、エラーはスローされませんでした。このコードをints で実行すると、ゼロ除算の算術例外が確実に発生します。sに関してJavaがそれを無視するのはなぜdoubleですか?
5 に答える
ゼロ除算の結果は、数学的に言えばundefinedであり、float/double (NaN数値ではない) で表現できますが、基本的な意味で間違っているわけではありません。
整数は特定の数値を保持する必要があるため、それらを処理するときにゼロ除算でエラーをスローする必要があります。
double の格納方法は、int とはまったく異なります。Java が double 計算を処理する方法の詳細については、http://firstclassthoughts.co.uk/java/traps/java_double_traps.htmlを参照してください。また、浮動小数点数、特にNot a Number (NaN)の概念についても読む必要があります。
浮動小数点表現について詳しく知りたい場合は、このドキュメント(Word 形式、申し訳ありません) を読むことをお勧めします。数値の 2 進表現について詳しく説明しているため、理解に役立つ場合があります。
Java 開発者は double プリミティブ型とクラスについて知っていますが、浮動小数点演算を行う際に、 、、およびそれらに関連する算術計算を制御するその他の規則Doubleに十分な注意を払っていません。Double.INFINITYNaN-0.0
この質問に対する簡単な答えは、それが throwArithmeticExceptionも returnもしないということDouble.INFINITYです。また、それ自体がであっても、比較x == Double.NaNは常に と評価されることに注意してください。falsexNaN
xが であるかどうかをテストするにはNaN、メソッド呼び出しDouble.isNaN(x)を使用して、指定された数値が NaN であるかどうかを確認する必要があります。NULLこれはinに非常に近いSQLです。
それはあなたに役立つかもしれません。