我正在将“NaN”值解析为double,它给我的是“NaN”。
double d = Double.parseDouble("NaN");
System.out.println(d);
正在打印“NaN”值。我很惊讶,因为我会expect解析一个非数字的双重结果会导致Java中的NumberFormatException
。
任何人都可以解释为什么解析成功了,真正存储在变量中的是什么?
答案 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)
答案 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.