[Seasar-user:3048] XlsReader などで BigDecimal を使う際の精度の問題

suga ko.suga
2005年 12月 21日 (水) 10:52:04 JST


suga です。

S2Unit には Bean の値と Excel から読み込んだ値とを比較する便利な
機能がありますが、Bean の BigDecimal 型プロパティの場合に、
浮動小数点数の精度の関係で比較が失敗してしまいます。

# たとえば new BigDecimal("0.05") と 0.05d で発生します


一応、以下の対応で問題なく比較できるようになります。
対応をしていただければ助かります。

ひょっとすると setScale をする方が正しいのかもしれませんが、
その点は私ではわかりません。


org.seasar.extension.dataset.impl.XlsReader
    public Object getValue(HSSFCell cell) {
        (略)
            case HSSFCell.CELL_TYPE_NUMERIC :
                (略)

                return new BigDecimal(
                        Double.toString(cell.getNumericCellValue()));
                        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

org.seasar.framework.util.BigDecimalConversionUtil
    public static BigDecimal toBigDecimal(Object o, String pattern) {
        (略)
        } else if (o instanceof Double) {
            return new BigDecimal(((Double) o).toString());
                                               ^^^^^^^^
        (略)
        } else if (o instanceof Float) {
            return new BigDecimal(((Float) o).toString());
                                              ^^^^^^^^
    こういうのを作って XlsReader で使っても良いかもしれません。

    public static BigDecimal toBigDecimal(double d) {
        return toBigDecimal(Double.toString(d), null);
    }

    public static BigDecimal toBigDecimal(float f) {
        return toBigDecimal(Float.toString(f), null);
    }


--
suga ( ko.suga @ gmail.com )


Seasar-user メーリングリストの案内