我有一个带有浮动列的表(我使用的是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 )对数字进行四舍五入。
有人能解释一下为什么吗?...or就是我一个人?
发布于 2011-12-14 02:59:22
如果您想了解有关浮点数的所有信息以及它们具有舍入误差的原因,请参见What Every Computer Scientist Should Know About Floating-Point Arithmetic。
如果你想做货币计算,不要使用float!使用固定点数据类型。如果您使用rails迁移,那么decimal类型就是您想要的described here。
发布于 2014-02-12 11:27:25
公认的答案通常是正确的(并且使用decimal而不是float可以解决这个问题)。
然而,这里有一个更深层次的问题。
mysql2驱动程序没有指定它希望mysql返回的精度,因此数据库返回截断的结果。
您可以通过将数量乘以浮点数来强制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发布于 2011-12-14 02:41:07
MySQL文档将float描述为一种“近似数字数据类型”...probably,不适合存储货币值。尝试将"amount“定义为小数。
https://stackoverflow.com/questions/8494322
复制相似问题