事務処理計算システムの移行


元々COBOLで作られていた事務処理計算のシステムをJavaに移行しようとしているのだが、精度を保つためにBigDecimalをそのまま使うと四則演算もメソッド経由になるので面倒。


また、お客さんから「仕様変更の際に簡単に計算式を変えたい」という要望もある。


で、移行後のシステムをSeasar2を使って実装する予定であるため、「じゃあOGNLで式を書いてもらうかね。丁度Seasar2使うのにOGNLライブラリ入れてるし」という安易な考えでOGNLのソースをグリグリみてみたのだが、OgnlOpsクラスの中でBigDecimalの割り算の際に決めうちで「BigDecimal.ROUND_HALF_EVEN」を使っている。


予想はしていたけれど、割り算の際のscale設定さえどうにかなれば今回の要件で使えるはずなので残念。
「OgnlOps#divide()」はクラスメソッドだから差し替えにくいしねぇ。
「ASTDivide」を差し替えるために「ognl.jjt」を書き換える?
いやいやいや。


じゃあ、Groovy調べるか。



追記
Google先生に「OGNL ROUND_HALF_EVEN」で問い合わせたら以下のページを発見。
http://blogsite.3322.org/jspwiki/pages/viewblog?id=2468
中国語ですか。
ひとまず3つの解決法のうち、上の2つは「ROUND_HALF_EVENされても困らないscaleを設定しておけや」いう主旨のようだ。
まぁそりゃそうだが。
3つ目は多分OGNLのソースを改造しろって言う主旨だと思う。たぶん。