Ruby on Rails模型。 为什么范围为1的十进制{2,1}允许小数点后的数字?
尽管定义了它的精度和范围,但是在小数点后接受过多位数的表存在问题。
rails generate model Hotel name:string 'rating:decimal{2,1}' class CreateHotels < ActiveRecord::Migration def change create_table :hotels do |t| t.string :name t.decimal :rating, precision: 2, scale: 1 t.timestamps end end end
但是,我能够做到以下几点。
Hotel.create!(name: “The Holiday Inn”, rating: 3.75)
另外,我有一个房间桌(房间模型),有
t.decimal :rate, precision: 5, scale: 2 #this holds the room's nightly rate
我在这列中输入了99.99,但最终将其存储为99.98999999 ..
为什么我有这两个小数问题? 如果我已经定义了我的范围,为什么我可以输入比我定义的范围更多的范围?
我在这列中输入了99.99,但最终将其存储为99.98999999 …
这表明你使用的SQLite实际上没有decimal
数据类型,如果你要求SQLite创建一个decimal(m,n)
列,它将创建一个REAL
; REAL
是浮点类型,而不是固定精度类型。 要解决此问题,请停止使用SQLite; 可能的是,你不打算在SQLite之上部署真正的应用程序,所以你应该使用你要部署的同一个数据库进行开发。
此外,如果您使用固定精度类型进行rating
,则不应该这样说:
Hotel.create!(name: "The Holiday Inn", rating: 3.75)
因为3.75将是Ruby中的浮点值,它可能会在数据库看到它之前搞砸了。 你应该说其中一个:
Hotel.create!(name: "The Holiday Inn", rating: '3.75') Hotel.create!(name: "The Holiday Inn", rating: BigDecimal.new('3.75'))
这样你就可以远离浮动点从前到后。