データベースに出入りした後、2 桁の 10 進数が余分な 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 で割る必要がある回数を格納していますか (これは、10 進数の列に期待されることです)。または、DB から値を取得する際に気付いていない ActiveRecord の落とし穴がありますか? 下記参照:
$ rails c
>> decimal = BigDecimal.new('9.46')
>> Item.first.price == decimal
=> false