我的rails应用程序中有一个pieces
模型,每个部分都有一个名为:price
的小数。我想验证这个价格是小数点后两位,大于0,不到一百万美元。我已经查看了堆栈溢出的众多来源,每当我为这些验证键入小数时,例如4.99,价格变为4.990000000000000213162820728030055761。这已经发生在我查找过的所有验证中。这是因为我需要在数据库中指定小数的精度吗?我怎样才能解决这个问题?
我目前的验证:
validates :price, :presence => true, :format => { :with => /\A(\$)?(\d+)(\.|,)?\d{0,2}?\z/ }
多谢你们!
我不知道您正在使用哪个数据库,但您可以像这样定义迁移的精度,
add_column :pieces, :price, :decimal, precision: 8, scale: 2
它会给你总共8位数,小数点后2位。
关于验证,
如果你想要:price
应该总是有两个小数位(即:4.99)你可以尝试这个,
validates :price, presence: true, format: { with: /\A\d+(?:\.\d{2})?\z/ }, numericality: { greater_than: 0, less_than: 1000000 }
如果你想要:price
最多只有两位小数或更小(即:4,4.9,4.99)你可以试试这个,
validates :price, presence: true, format: { with: /\A\d+(?:\.\d{0,2})?\z/ }, numericality: { greater_than: 0, less_than: 1000000 }
或者,如果您不想验证精度并且只想在将精度保存到数据库之前将精度四舍五入,则可以使用round_with_precision。
您应该在数据库上设置它。例如,在迁移中:
add_column :products, :price, :decimal, precision: 5, scale: 2
精度是数字中的位数。 Scale是数字中小数点右边的位数。例如,数字123.45的精度为5,标度为2.在SQL Server中,数字和十进制数据类型的默认最大精度为38。
如果您看到您的值正在添加其他数字,那么可能发生的情况是您的列被设置为浮点类型。如果您使用美元值,请不要使用浮点数。 M. Karim的答案很好。