双数据类型解析“NaN”为“NaN”为什么?

时间:2013-04-29 10:52:48

标签: java nan

我正在将“NaN”值解析为double,它给我的是“NaN”。

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

正在打印“NaN”值。我很惊讶,因为我会expect解析一个非数字的双重结果会导致Java中的NumberFormatException

任何人都可以解释为什么解析成功了,真正存储在变量中的是什么?

4 个答案:

答案 0 :(得分:9)

您可能会对此特殊值存储在double变量中感到惊讶。这是因为Java使用IEEE 754标准进行浮点表示。

该标准不仅可以表示特定的有理数,还可以表示一些特殊值,例如加上无穷大或负无穷大,这些数值本质上是非常大的数字 - 计算结果比任何可表示的理性值产生更大的结果。 (还有非正规数,位于有限值和无限值之间;与你习惯的精度相比,它们的精度降低了,但不如无穷大那么精确。精度的损失是由给予更多的空间以尾数为代价的指数。)

但是,NaN不是无穷大,也不是溢出或下溢的指标。这不是任何计算的不准确结果。它是一个非值,类似于数据库中的NULL。事实上,在你的程序中试试这个:

System.out.println(d == d)

它将打印出false

为什么是假的?简而言之,如果您知道两个数量的值,则没有理由假设它们是相同的值。他们通常不是。

NaN的输入上看到double.ParseDouble实际上很不寻常,除非在某种解组时。

答案 1 :(得分:2)

因为" NaN"不是数字。
Double.parseDouble()期望字符串格式为double值

答案 2 :(得分:1)

嗯,“NaN”是“非数字”,是双倍的有效值。

所以,如果你解析“NaN”,那么得到“NaN”似乎是合乎逻辑的。

你应该看看In Java, what does NaN mean?

答案 3 :(得分:0)

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.