mysql - 数据库级别的 Rails 舍入 float

标签 mysql ruby-on-rails ruby rounding

我有一个带有浮点列的表(我正在使用 MySQL、mysql2 gem,一切都是标准的)

create_table :some_table do |t| 
  t.float  :amount 
end 

当我这样做的时候,我正在控制台中玩耍

a = SomeTable.new
a.amount = 9999.99
a.save!
#9999.99
a.amount
#9999.99
a.reload
a.amount
#9999.99

一切顺利

a = SomeTable.new
a.amount = 9999.999
a.save!
#9999.999
a.amount 
#9999.999
a.reload
a.amount
#10000.00

如您所见,ruby(或 rails)对数字进行四舍五入。

谁能解释一下这是为什么? ...还是只有我?

最佳答案

接受的答案通常是正确的(使用 decimal 而不是 float 可以解决这个问题)。

然而,这里还有一个更深层次的问题。

mysql2 驱动程序未指定它希望 mysql 返回的精度,因此数据库返回的结果被截断了。

您可以通过将数量乘以 float 来强制 mysql 返回完整精度。

class SomeTable
  default_scope -> { select("some_tables.*, amount * 1.0000000000000000 as amount")}
end

a = SomeTable.new
a.amount = 9999.999
a.save!
#9999.999
SomeTable.last.amount 
#9999.999
SomeTable.unscoped.last.amount
#10000.00

关于mysql - 数据库级别的 Rails 舍入 float ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8494322/

相关文章:

mysql - 如何查看我的权限?

mysql - 将 Entity Framework Data First 与 ODBC 和 MySQL 结合使用

ruby-on-rails - Rails 3 iso-3166-country-select 插件如何包含空白并设置优先级国家?

ruby - 如何在 MacOS 上使用 "RVM --default"

ruby-on-rails - ruby/rails 中的日期范围

mysql - 从多个表中选择

MYSQL 搜索表、位字段

ruby-on-rails - 如果指定,rails has_many setter 应该设置条件

ruby-on-rails - 如何告诉 capybara-webkit 不要忽略确认框(或者只是测试它们的内容)

Ruby:获取扩展模块列表?