BigDecimalとDecimalFormat
BigDecimalに対してDecimalFormatでフォーマットをかけると、
数値の大きさによってはかなりおかしな数字が返ってくる模様。
たとえば、
BigDecimal bd = new BigDecimal("12345678901234567"); DecimalFormat df = new DecimalFormat("#");
を実行すると 12345678901234568 が返ってきちゃったり。
一桁減らして
BigDecimal bd = new BigDecimal("1234567890123456"); DecimalFormat df = new DecimalFormat("#");
ならちゃんと 1234567890123456 が返ってくるんだけど。
そしたらどうも、JDK 5.0 から正式なサポートなんだとか。
DecimalFormat クラスの機能が拡張され、BigDecimal および BigInteger の値を精度を失わずに書式設定および解析することが可能になりました。それらの値の書式設定の機能は、自動的に有効になります。ただし、解析結果を BigDecimal にするには、setParseBigDecimal メソッドを使用して機能を有効にする必要があります。
基本的にBigDecimalに対してのフォーマットは
やらない方がよさそうです。
桁数が多いと勝手に丸められるし。
0.1234567890123456789 の場合は 0.1234567890123456789、
0.1230000000000000000 の場合は 0.123
となるようにしたかったのだけれども、
DecimalFormatを使ったら無理だということで。orz
仕方ないので文字列操作で末尾の 0 を消す方向で。
まあこっちの方がフォーマットなんかより
はるかにコストは安いしぃー(苦し紛れ)
あ、汎用部品なので「そんな数字入れる方がおかしい」って
ツッコミはナシでお願いします。