きどたかのブログ

いつか誰かがこのブログからトラブルを解決しますように。

IBM JDKのBigDecimalはバグってるっぽい。

職場で使ってるRAD7.5.2で使ってるjava -version。
....\IBM\SDP\jdk\bin>java.exe -version

                                            • -

java version "1.6.0"
Java(TM) SE Runtime Environment (build pwi3260sr4-20090219_01(SR4))
IBM J9 VM (build 2.4, J2RE 1.6.0 IBM J9 2.4 Windows XP x86-32 jvmwi3260-20090215_29883 (JIT enabled, AOT enabled)
J9VM - 20090215_029883_lHdSMr
JIT - r9_20090213_2028
GC - 20090213_AA)
JCL - 20090218_01

                                            • -


java.lang.Character#isDigit(char)のJavaDocに記載されている文字からBigDecimalを作るとヤバイ。

* '\u0030' through '\u0039', ISO-LATIN-1 digits ('0' through '9')
* '\u0660' through '\u0669', Arabic-Indic digits
* '\u06F0' through '\u06F9', Extended Arabic-Indic digits
* '\u0966' through '\u096F', Devanagari digits
* '\uFF10' through '\uFF19', Fullwidth digits


ISO-LATIN-1だけはさすがに大丈夫だった。
問題が起こるケースっつーのは、new BigDecimal(String)というコンストラクタ
なぜだか期待する値よりも-48された値になってしまう。


この事象は、以下で言われている内容とは全然関係ないと感じている。
http://www-06.ibm.com/jp/domino01/mkt/cnpages1.nsf/page/default-0006D2D1

スケールなんて与えてないさ。デフォルト0でしょ。


SunのJDKなら大丈夫。どのdigitsも期待通り0〜9まで認識されてる。

                                            • -

java version "1.6.0_13"
Java(TM) SE Runtime Environment (build 1.6.0_13-b03)
Java HotSpot(TM) Client VM (build 11.3-b02, mixed mode, sharing)

                                            • -


複雑なケースは試していない。


こんなの問い合わせてもオイラは幸せになれないよ。