2016-07-22 7 views
1

私のレールアプリにはpiecesモデルがあり、各部品の小数は:priceとなっています。私は、この価格が0より小数点以下2桁で、100万ドル未満であることを検証したいと思います。 Stack overflowに関する多くの情報源を調べました。たとえば、4.99など、これらの検証の小数点を入力すると、価格は4.9900000000000213162820728030055761になります。これは、私が調べたすべてのバリデーションに対して起こっています。これは私の精度をデータベースの小数部に指定する必要があるためですか?これをどうすれば解決できますか?レール4の価格のバリデーション

私の現在の検証:

validates :price, :presence => true, :format => { :with => /\A(\$)?(\d+)(\.|,)?\d{0,2}?\z/ } 

みんなありがとう!

答えて

3

である私は知らない 、5の精度とSQL Serverでの2の規模を持っています使用しているが、あなたは、このようなあなたの移行に

add_column :pieces, :price, :decimal, precision: 8, scale: 2 

を精密に定義できるデータベースこれは、小数点以下2で、あなたの8桁の合計を与えます。検証について


あなたは :priceは常に2つの小数点以下の桁数を持つべきであることをしたい場合(例:4.99)あなたはこれを試すことができ、

validates :price, presence: true, format: { with: /\A\d+(?:\.\d{2})?\z/ }, numericality: { greater_than: 0, less_than: 1000000 } 

あなたは:priceが持つべき場合、最大で2小数点以下(すなわち:4、4.9、4.99)あなたは

validates :price, presence: true, format: { with: /\A\d+(?:\.\d{0,2})?\z/ }, numericality: { greater_than: 0, less_than: 1000000 } 

それとも、精度を検証したくないし、ちょうどあなたがもしCのデータベースに保存する前に精度を切り上げしたい場合は、これを試すことができます使用round_with_precision

0

データベースに設定する必要があります。例えば、移動中:

add_column :products, :price, :decimal, precision: 5, scale: 2 

精度番号の桁数です。 Scaleは、数字の小数点以下の桁数のうち、 の数字です。例えば、 数123.45は、数字と小数点データ型のデフォルトの最大精度は38

https://msdn.microsoft.com/en-us/library/ms190476.aspx

0

値が増えていることがわかっている場合は、列が浮動小数点型として設定されている可能性があります。ドル値で作業している場合は、浮動小数点数を使用しないでください。 M. Karimの答えはそうでなければ大丈夫です。

関連する問題