ActionWebServiceと BigDecimal
Apache CXF + Aegis Bindingでは Webサービスのオペレーション引数・返値に java.math.BigDecimal型を使うことが出来る。
Railsの ActionWebServiceはどうかと思って調べたら、intか floatしかない。オーノー
ブログや掲示板やSNSみたいなおもちゃならintがあれば十分なわけなのでともかく、業務システムの場合しばしば「小数を」「ユーザの常識により期待される形で」「わりと多くの箇所に」表示する必要があるわけで、それに floatを用いるのは結構きびしい。
(rubyでは名前こそFloatであるものの実装は doubleであるらしいが、精度の高さは問題ではない)
銅線 計19.99999999kg 入荷済みとか画面に表示されたら普通困るよね。
かといって0.000000001とか(桁数適当。念のため)足してから文字列表現に直す、っていう処理を各所にばらまくという非生産的な仕事はなるべく作りたくない。
データベースからNUMERIC型のフィールドを読み込む時に floatを使うとデータベース側で設定した有効桁数より下の方には適当な値が入ってたりするし。
悲しいけどこれ、仕様なのよね。たまにバグだって騒ぐ輩が沸くみたいだけど(さらにバグfixだって言って意味不明な仕様変更をする開発者もいるみたいだけど)。
あるていどfloatの性質をわかっている者が実装をするなら対処できるかもしれないが、途中から実装を他人任せにする案件ではカオスの元凶としかいいようがないので、こういうところでは最初から BigDecimalを使っておきたい。
しかしながら、railsのリポジトリを眺めてみたところ trunkでは :decimal で BigDecimal型が使えるようになっているようだったので、とりあえず今だけ我慢すればいいかということで終了。
Railsの ActionWebServiceはどうかと思って調べたら、intか floatしかない。オーノー
ブログや掲示板やSNSみたいなおもちゃならintがあれば十分なわけなのでともかく、業務システムの場合しばしば「小数を」「ユーザの常識により期待される形で」「わりと多くの箇所に」表示する必要があるわけで、それに floatを用いるのは結構きびしい。
(rubyでは名前こそFloatであるものの実装は doubleであるらしいが、精度の高さは問題ではない)
銅線 計19.99999999kg 入荷済みとか画面に表示されたら普通困るよね。
かといって0.000000001とか(桁数適当。念のため)足してから文字列表現に直す、っていう処理を各所にばらまくという非生産的な仕事はなるべく作りたくない。
データベースからNUMERIC型のフィールドを読み込む時に floatを使うとデータベース側で設定した有効桁数より下の方には適当な値が入ってたりするし。
悲しいけどこれ、仕様なのよね。たまにバグだって騒ぐ輩が沸くみたいだけど(さらにバグfixだって言って意味不明な仕様変更をする開発者もいるみたいだけど)。
あるていどfloatの性質をわかっている者が実装をするなら対処できるかもしれないが、途中から実装を他人任せにする案件ではカオスの元凶としかいいようがないので、こういうところでは最初から BigDecimalを使っておきたい。
しかしながら、railsのリポジトリを眺めてみたところ trunkでは :decimal で BigDecimal型が使えるようになっているようだったので、とりあえず今だけ我慢すればいいかということで終了。
ラベル: Rails

0 件のコメント:
コメントを投稿
<< ホーム