【发布时间】:2012-09-30 07:37:45
【问题描述】:
我有点困惑,一个 2 位小数在进出数据库后会额外增加 0.000000000000000001(左右)。
这就是我所做的:(Rails 3.2.8)
创建迁移:
class CreateItems < ActiveRecord::Migration
def change
create_table :items do |t|
t.column :price, :decimal, :precision => 16, :scale => 2
end
end
end
创建了一个模型:
class Item < ActiveRecord::Base
end
然后:
$ rails c
>> i = Item.new
>> i.price = 9.46
>> i.save
>> Item.first.price
=> #<BigDecimal:46b3768,'0.9460000000 000001E1',27(45)>
这是一个 SQLite 数据库,里面看起来一切正常:
$ rails db
>> select * from items;
1|9.46
请注意,我注意到发生这种情况的唯一数字是 9.46。 额外的 0.00000000000001 是从哪里来的?
编辑 我知道,如果没有小错误,某些数字的浮点表示是不可能的。但是为什么Item.first.price 不等于BigDecimal.new('9.46')? SQLite 是否存储一个浮点数而不是一个整数,并且它应该被除以 10 的次数(这就是我对小数列的期望)?或者 ActiveRecord 中是否有一些我不知道从数据库中检索值的问题?见下文:
$ rails c
>> decimal = BigDecimal.new('9.46')
>> Item.first.price == decimal
=> false
【问题讨论】:
-
我认为我对 Ruby BigDecimal 类型不使用浮点运算的假设是错误的(实际上,我应该能够自己解决)
标签: ruby-on-rails ruby sqlite activerecord