2

「NaN」値を2倍に解析していますが、「NaN」として返されます。

double  d = Double.parseDouble("NaN");
System.out.println(d);

「NaN」値を出力しています。double の非数値を解析すると Javaになると予想されるので、私は驚いています。NumberFormatException

解析が成功した理由と、変数に実際に格納されたものを誰か説明できますか?

4

4 に答える 4

9

この特別な値がdouble変数に格納されていた可能性があることにおそらく驚かれることでしょう。これは、Java が浮動小数点表現に IEEE 754 標準を使用しているためです。

この標準では、特定の有理数だけでなく、正の無限大や負の無限大など、本質的に非常に大きな数であるいくつかの特別な値 (表現可能な有理数よりも大きな結果をもたらす計算結果) も表すことができます。(有限値と無限値の間のどこかにある非正規数もあります。これらの精度は、慣れ親しんだ精度に比べて低下しますが、無限大ほど極端ではありません。精度の低下は、より多くの余地を与えることによって引き起こされます仮数を犠牲にした指数。)

ただし、aNaNは無限大でも、オーバーフローまたはアンダーフローの指標でもありません。これは、計算の不正確な結果ではありません。NULLこれは、データベースの に似た非値です。実際に、あなたのプログラムでこれを試してください:

System.out.println(d == d)

印刷されfalseます。

なぜ偽?大まかに言えば、2 つの量の値がわからない場合それらが同じ値であると仮定する理由はありません。彼らは通常そうではありません。

ある種のアンマーシャリング中を除いて、へのNaN入力がオンになることは、実際には非常に珍しいことです。double.ParseDouble

于 2013-04-29T11:08:58.107 に答える
2

さて、「NaN」は「非数」であり、double の有効な値です。

したがって、「NaN」を解析すると、結果として「NaN」が得られるのは論理的に思えます。

In Java, what does NaN mean? をご覧ください

于 2013-04-29T10:55:29.327 に答える
2

NaNは数値ではありません。

"NaN" stands for "not a number". "Nan" is produced if a 
floating point operation has some input parameters that cause the 
operation to produce some undefined result. For example, 0.0 divided 
by 0.0 is arithmetically undefined. Taking the square root of a negative 
number is also undefined. 
于 2013-04-29T10:54:42.823 に答える
1

「NaN」は数値ではないためです。
Double.parseDouble()文字列形式の double 値が必要です

于 2013-04-29T10:53:29.560 に答える