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

Yog*_*esh 2 java nan

我正在解析"NaN"值为double,它给我的是"NaN".

double  d = Double.parseDouble("NaN");
System.out.println(d);
Run Code Online (Sandbox Code Playgroud)

它正在打印"NaN"值.我很惊讶,因为我希望解析一个非数字的双重将导致NumberFormatExceptionJava.

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

Jir*_*ika 9

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

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

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

System.out.println(d == d)
Run Code Online (Sandbox Code Playgroud)

它会打印出来false.

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

实际上很难看到NaN输入double.ParseDouble,除非在某种解组时.