Java中double的字符串表示是否精确?该解析等式是否被Java保证?
问题
是否Java会保证以下等式始终成立?
Double.parseDouble(Double.toString(x)) == x
(编辑说明:改用parseDouble以避免不必要的装箱操作。)
回答
这个等式并非在所有场景下都成立,具体分情况讨论:
- 当
x为Double.NaN时:Double.toString(x)返回字符串"NaN",Double.parseDouble("NaN")会得到NaN,但Java中NaN == NaN的结果是false(因为NaN与任何值都不相等,包括自身),因此等式不成立。 - 当
x为Double.POSITIVE_INFINITY或Double.NEGATIVE_INFINITY时:toString会分别输出"Infinity"和"-Infinity",parseDouble解析后会得到对应的无穷大值,此时Infinity == Infinity、-Infinity == -Infinity结果均为true,等式成立。 - 当
x是有限的非NaN double值时:Java规范明确保证Double.parseDouble(Double.toString(x))会返回与x完全一致的double值,因此==比较结果为true,等式成立。这是因为Double.toString(x)会生成符合规范的最短十进制字符串,确保解析后能精确还原原数值。
总结:只有当x为NaN时等式不成立,其余场景下等式均被Java保证成立。
内容的提问来源于stack exchange,提问作者Michel Charpentier
相关产品推荐
相关产品推荐

