我将“NaN”值解析为双倍,它给了我“NaN”。
double d = Double.parseDouble("NaN");
System.out.println(d);
它正在打印“NaN”值。我很惊讶,因为我预计将非数字解析为双精度会导致NumberFormatException
Java。
谁能解释为什么解析成功,以及变量中真正存储了什么?
您可能会惊讶于这个特殊值可能存储在double
变量中。这是因为 Java 使用 IEEE 754 标准进行浮点表示。
该标准不仅允许表示特定的有理数,还允许表示一些特殊值,例如正无穷大或负无穷大,它们本质上是非常大的数字 - 计算结果产生的结果比任何可表示的有理值都大。(也有非正规数,介于有限值和无限值之间;与您习惯的精度相比,它们的精度有所降低,但不像无穷大那样极端。精度损失是由于给了更多空间以尾数为代价的指数。)
但是,aNaN
不是无穷大,也不是上溢或下溢的指示符。这不是任何计算的不准确结果。它是一个非值,类似于NULL
数据库中的一个。事实上,在你的程序中试试这个:
System.out.println(d == d)
它会打印出来false
。
为什么是假的?粗略地说,如果你不知道两个量的值,就没有理由假设它们是相同的值。他们通常不是。
除了在某种解组期间,看到对 的NaN
on 输入实际上是很不寻常的。double.ParseDouble
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()
期望字符串格式的双精度值