首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Rails在DB级舍入浮点数

Rails在DB级舍入浮点数
EN

Stack Overflow用户
提问于 2011-12-14 02:34:02
回答 4查看 2.6K关注 0票数 4

我有一个带有浮动列的表(我使用的是MySQL,mysql2 gem,一切标准的东西)

代码语言:javascript
复制
create_table :some_table do |t| 
  t.float  :amount 
end 

我在控制台里玩,当我这样做时

代码语言:javascript
复制
a = SomeTable.new
a.amount = 9999.99
a.save!
#9999.99
a.amount
#9999.99
a.reload
a.amount
#9999.99

一切都很好

代码语言:javascript
复制
a = SomeTable.new
a.amount = 9999.999
a.save!
#9999.999
a.amount 
#9999.999
a.reload
a.amount
#10000.00

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

有人能解释一下为什么吗?...or就是我一个人?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-12-14 02:59:22

如果您想了解有关浮点数的所有信息以及它们具有舍入误差的原因,请参见What Every Computer Scientist Should Know About Floating-Point Arithmetic

如果你想做货币计算,不要使用float!使用固定点数据类型。如果您使用rails迁移,那么decimal类型就是您想要的described here

票数 3
EN

Stack Overflow用户

发布于 2014-02-12 11:27:25

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

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

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

您可以通过将数量乘以浮点数来强制mysql返回全精度。

代码语言:javascript
复制
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
票数 4
EN

Stack Overflow用户

发布于 2011-12-14 02:41:07

MySQL文档将float描述为一种“近似数字数据类型”...probably,不适合存储货币值。尝试将"amount“定义为小数

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8494322

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档