69

2 つの数値のパーセンテージの差を計算するコードがあります - (oldNum - newNum) / oldNum * 100;- 両方の数値がdoubles です。oldNum が 0 の場合、何らかのチェック/例外処理を追加する必要があると予想していました。ただし、oldNum と newNum の両方の値を 0.0 にしてテストを実行すると、何も起こらなかったかのように実行が続行され、エラーはスローされませんでした。このコードをints で実行すると、ゼロ除算の算術例外が確実に発生します。sに関してJavaがそれを無視するのはなぜdoubleですか?

4

5 に答える 5

113

Javafloatdoubleタイプは、他のほとんどの言語(およびほとんどすべてのハードウェアFPユニット)と同様に、浮動小数点演算用のIEEE 754標準を実装します。これは、ゼロによる除算で特別な「無限大」値を返すことを義務付けています。例外をスローすると、実際にはその標準に違反します。

整数演算( Javaおよび他のほとんどの言語とハードウェアによって2の補数表現として実装される)は異なり、特別な無限大またはNaN値がないため、例外をスローすることは便利な動作です。

于 2010-03-04T18:16:19.183 に答える
47

ゼロ除算の結果は、数学的に言えばundefinedであり、float/double (NaN数値ではない) で表現できますが、基本的な意味で間違っているわけではありません。

整数は特定の数値を保持する必要があるため、それらを処理するときにゼロ除算でエラーをスローする必要があります。

于 2010-03-04T17:58:39.990 に答える
5

double の格納方法は、int とはまったく異なります。Java が double 計算を処理する方法の詳細については、http://firstclassthoughts.co.uk/java/traps/java_double_traps.htmlを参照してください。また、浮動小数点数、特にNot a Number (NaN)の概念についても読む必要があります。

浮動小数点表現について詳しく知りたい場合は、このドキュメント(Word 形式、申し訳ありません) を読むことをお勧めします。数値の 2 進表現について詳しく説明しているため、理解に役立つ場合があります。

于 2010-03-04T18:05:18.163 に答える
4

Java 開発者は double プリミティブ型とクラスについて知っていますが、浮動小数点演算を行う際に、 、、およびそれらに関連する算術計算を制御するその他の規則Doubleに十分な注意を払っていません。Double.INFINITYNaN-0.0

この質問に対する簡単な答えは、それが throwArithmeticExceptionも returnもしないということDouble.INFINITYです。また、それ自体がであっても、比較x == Double.NaNは常に と評価されることに注意してください。falsexNaN

xが であるかどうかをテストするにはNaN、メソッド呼び出しDouble.isNaN(x)を使用して、指定された数値が NaN であるかどうかを確認する必要があります。NULLこれはinに非常に近いSQLです。

それはあなたに役立つかもしれません。

于 2016-02-02T10:18:36.490 に答える