java file(file, - なぜ1/0はエラーを出しますが、1 / 0.0は "Inf"を返しますか?





"rt") でエラー: (5)


1/0は整数除算、1 / 0.0は浮動小数点除算です - 浮動小数点数は無効な値を表すことができ、整数はできません。

私はちょうどこれについて興味がある:

Javaで1/0を評価すると、次の例外が発生します。

スレッド「main」の例外java.lang.ArithmeticException:/ Foo.main(Foo.java:3)のゼロによって

しかし、 1/0.0Infinity評価されます。

public class Foo {
    public static void main (String[] args) {
        System.out.println(1/0.0);
    }
}

なぜこれが起こるのですか?




これは、整数に+/- Inf、NaNの値がなく、浮動小数点数に特殊な値があるのに対し、整数は0で除算できないためです。




1/0は2つのintの除算であり、整数ゼロで除算できないため例外がスローされます。 ただし、0.0はdouble型のリテラルであり、Javaは浮動小数点除算を使用します。 IEEE浮動小数点の仕様には、0​​で割るための特別な値があります(他のものの中でも特に)、doubleの1つです。

詳細に関心があるならば、浮動小数点仕様(しばしば謎めいている)はWikipediaにhttp://en.wikipedia.org/wiki/IEEE_754-2008というページがあり、その全文もオンラインで読むことができます: http://ieeexplore.ieee.org/xpl/mostRecentIssue.jsp?punumber=4610933 : http://ieeexplore.ieee.org/xpl/mostRecentIssue.jsp?punumber=4610933




IEEEでは、「Not a Number」と正と負の無限大の定義を含む浮動小数点数の特定の標準を定義しています。 これらは整数には当てはまりません。

http://steve.hollasch.net/cgindex/coding/ieeefloat.html参照してhttp://steve.hollasch.net/cgindex/coding/ieeefloat.html

基本的に丸め誤差におけるこれらの特殊なケースの理由。 浮動小数点数は決して正確ではないため、常に切り捨てられます。 一方、整数は常に正確です。










java double int