web-dev-qa-db-ja.com

価格フィールドの文字列、10進数、または浮動小数点データ型?

価格フィールド/列(例:15.50 USD)がありますが、Railsデータ型は文字列、10進数、または浮動小数点数にする必要がありますか?

37

この引数には常に10進数と整数の2つの側面があります。整数のサポーターは、小数は(変換を行う場合)正確ではない可能性があり、BigDecimalの実装にはバグが含まれ、場合によってはsegfaultingさえあると主張しています。

私自身のプロジェクトでは、整数も取得し、それらをカスタムコンテナーにラップして、セントを「実際の」金額に変換し、戻しました。最初はいい感じでしたが、しばらくすると使いづらくなりました-セントを処理しているときや、フォーマットされた文字列を使っているときのトラッキングなど。

次に、10進数に戻しました-常に同じ形式で、必要に応じて簡単に金額をセントに変換できます。さまざまな丸めアルゴリズムをそのまま使用できます。私は小数ではるかに満足しています。

そして、小数が正確でないという問題に対処するために-グーグルするとき、ほとんどのバグが小数を浮動小数点に変換することに関連していることに気付くかもしれません:)すでに述べたように、浮動小数点は正確ではなく、小数を浮く。これは、小数を処理するときに覚えておかなければならない最も重要なことの1つです。変換によって正確さを失わないようにする必要があります。ああ、私はBigDecimalを広範囲に使用している間、実際にRuby 1.8.7、1.8.7、および1.9.1でバグに遭遇したことはありません。

45
Tanel Suurhans
add_column :table, :price, :decimal, :precision => 8, :scale => 2

上記のコードが最善の策です。

53
Tom

フロートは正確ではありません:

0.3 - 0.2 - 0.1
=> -2.77555756156289e-17

値を格納するだけの場合を除き、これらを使用しないでください。

計算を行う必要がある場合は、セントでの価格を整数として保存します。ヘルパーを使用して簡単に米ドルとして表示できます。

11
vise

場合によります。

購入価格の計算を行う場合は、小数を使用してください。
工学数学を実行している場合は、フロートを使用します。
データを保存するだけの場合は、文字列を使用します。

11
Woot4Moo

可能であれば、価格には整数を使用することをお勧めします。多くの人気のある宝石(ActiveMerchant、Moneyなど)は整数の使用を想定しており、測定単位を基本単位(セントなど)で保存する方がよい場合がよくあります。

7
Kevin Sylvestre