今日もプログラミング

IT技術とかプログラミングのこととか特にJavaを中心に書いていきます

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