Double.parseDoubleできるのは「数字」だけではない
前回Integer.parseIntについて調べたので、今回はDouble.parseDoubleについて調べてみる。
JavaのdoubleというかIEEE754の浮動小数点数には、特殊な値がいくつかある。
非数(Double.NaN)と無限大(Double.POSITIVE_INFINITYとDouble.NEGATIVE_INFINITY)だ。
これらをtoStringすると、"NaN"、"Infinity"、"-Infinity"になる。
当然逆に、
Double.parseDouble("NaN") Double.parseDouble("Infinity") Double.parseDouble("-Infinity")
によりparseできる。
"+NaN"、"-NaN"、"+Infinity"でもOKのようだ。
他にもちょっと特殊な値として、-0というのがある。
しかし、0 == -0 はtrueである。
では何が違うのかというと、1/0.0は+∞だが、1/-0.0は-∞になる。
ちなみに、NaN == NaNはfalseである。
あと、"1.2e+3"(1200)のような科学表記もparseできる。
更に、Javadocを見ると、"0x…"みたいな16進形式にも対応しているらしい。
しかし"0x1D"だと通らないな。Javaのソースを追ってみると、FloatingDecimalクラスに
"([-+])?0[xX](((\\p{XDigit}+)\\.?)|((\\p{XDigit}*)\\.(\\p{XDigit}+)))[pP]([-+])?(\\p{Digit}+)[fFdD]?"
という正規表現が定義されている。なんだこりゃ。
よく見ると、"p"が必須らしい。
"0x0D.8p-1"をparseすると、6.75となった。
なんとなく分かった。(13 + 8/16) * 2-1ということだな。
Integer.parseIntでは全角数字が通ったので、Double.parseDoubleでも試してみる。
しかしNumberFormatExceptionになってしまった。
仕様の統一感がないなあ…。
次はBigDecimalを調べてみようかな。
JDK : 8u31