「NaN」値を2倍に解析していますが、「NaN」として返されます。
double d = Double.parseDouble("NaN");
System.out.println(d);
「NaN」値を出力しています。double の非数値を解析すると Javaになると予想されるので、私は驚いています。NumberFormatException
解析が成功した理由と、変数に実際に格納されたものを誰か説明できますか?
この特別な値がdouble
変数に格納されていた可能性があることにおそらく驚かれることでしょう。これは、Java が浮動小数点表現に IEEE 754 標準を使用しているためです。
この標準では、特定の有理数だけでなく、正の無限大や負の無限大など、本質的に非常に大きな数であるいくつかの特別な値 (表現可能な有理数よりも大きな結果をもたらす計算結果) も表すことができます。(有限値と無限値の間のどこかにある非正規数もあります。これらの精度は、慣れ親しんだ精度に比べて低下しますが、無限大ほど極端ではありません。精度の低下は、より多くの余地を与えることによって引き起こされます仮数を犠牲にした指数。)
ただし、aNaN
は無限大でも、オーバーフローまたはアンダーフローの指標でもありません。これは、計算の不正確な結果ではありません。NULL
これは、データベースの に似た非値です。実際に、あなたのプログラムでこれを試してください:
System.out.println(d == d)
印刷されfalse
ます。
なぜ偽?大まかに言えば、2 つの量の値がわからない場合、それらが同じ値であると仮定する理由はありません。彼らは通常そうではありません。
ある種のアンマーシャリング中を除いて、へのNaN
入力がオンになることは、実際には非常に珍しいことです。double.ParseDouble
さて、「NaN」は「非数」であり、double の有効な値です。
したがって、「NaN」を解析すると、結果として「NaN」が得られるのは論理的に思えます。
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.
「NaN」は数値ではないためです。
Double.parseDouble()
文字列形式の double 値が必要です