加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby-on-rails – 为什么postgreSQL将十进制字段存储为BigDecima

发布时间:2020-12-17 03:02:16 所属栏目:百科 来源:网络整理
导读:我在rails3 / postgreSQL中有以下模型/表: create_table "admin_reports",:force = true do |t| t.string "report" t.decimal "result" t.string "result_type" t.datetime "created_at" t.datetime "updated_at"end 在生产时,AdminReports.result不存储小
我在rails3 / postgreSQL中有以下模型/表:

create_table "admin_reports",:force => true do |t|
  t.string   "report"
  t.decimal  "result"
  t.string   "result_type"
  t.datetime "created_at"
  t.datetime "updated_at"
end

在生产时,AdminReports.result不存储小数,而是存储哈希:

AdminReport.last

=> #<AdminReport id: 4,report: "dau",result: #<BigDecimal:cbca0f0,'0.8E1',4(8)>,result_type: "percentage",created_at: "2012-02-28 22:05:15",updated_at: "2012-02-28 22:05:15">

我希望看到的地方:

AdminReport.last

=> #<AdminReport id: 4,result: 10.10,updated_at: "2012-02-28 22:05:15">

在rails控制台中,即使我尝试手动设置结果字段,如下所示:

@a = AdminReport.last
@a.result = 8.89
@a.save

它仍然将AdminReport.result显示为BigDecimal哈希.有什么想法在这里发生了什么?

谢谢

解决方法

您使用的是十进制列:

create_table "admin_reports",:force => true do |t|
  #...
  t.decimal  "result"
  #...
end

这通常意味着您要使用固定数量的小数位,因此您可能还需要指定:precision和:scale选项.当ActiveRecord看到一个十进制列时,它会将值转换为Ruby的BigDecimal,以便在Ruby-land中保持所需的小数位数;如果AR使用浮点值,那么你会遇到所有常见的浮点问题,你可能最终将一个值从数据库中拉出来并放回另一个值而不是故意改变它,使用BigDecimal完全避免了这个问题.

当你看到这个:

#<BigDecimal:cbca0f0,4(8)>

您刚刚看到BigDecimal的标准检查输出.如果你使用to_s(或“#{…}”),你会看到更熟悉的东西.

所以没什么好担心的.如果您需要使用非整数算术但不想要浮点的所有问题,那么十进制列(使用:precision和:scale)是正确的选择.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读