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')) 

这样你就可以远离浮动点从前到后。