Rails6からデフォルトで付与されるようになったprecisionとは?

こんにちは!kossyです!



さて、今回はRails6系からデフォルトで付与されるようになった、
precisionオプションについて、ブログに残してみたいと思います。




環境
Ruby 2.6.3
Rails 6.0.3
MacOS catalina




precisionとは?


Railsガイドによると、

precision: decimalフィールドの精度 (precision) を定義します。この精度は、その数字の総桁数で表されます。

とのことで、カラムの値(decimal)の精度を指定できるオプションになっています。

精度ってなんやねん

wikipedia先生に聞いてみました。

精度は、数値を表現する細かさであり、その数字の正確さとは(厳密には)異なる概念である(正確度と精度を参照)。ただし、機械加工などでは慣用的に、正確さに対して「精度」という言葉が使われている。

ふむ、数値を表現する細かさのことのようですね。

よくプログラムを書いていると「丸め誤差」という事象に遭遇することがありますが、

presicionを使えば、指定した桁数までは誤差を発生させずに計算ができるのでしょうか。

なぜデフォルトでpresicionが付与されるようになった?

実際のRailsプルリクがこちら

該当discussionがこちらですね。

I think the precision is for MySQL.
Well, if we could make it omit the precision on Postgres/SQLite and only add it on MySQL if the server supports it, that seems ideal to me.

精度はMySQL用だと思います。
そうですね、Postgres / SQLiteの精度を省略し、サーバーがサポートしている場合にのみMySQLに追加できるとしたら、それは私にとって理想的なようです。

presicionの指定はどういう時に使う?

たとえばDBに緯度経度の情報を格納したい時に使えます。

class CreateGeocodes < ActiveRecord::Migration[6.0]
  def change
    create_table :geocodes do |t|
      t.string :address, null: false, default: ""
      t.decimal :latitude,  precision: 11, scale: 8
      t.decimal :longitude, precision: 11, scale: 8
      t.timestamps
    end
   end
end

緯度・経度はMAX総桁数と小数点以下のMAX桁数が確定しているので、
桁数がわかる場合や、正確な計算が求められる場合は、presicionの指定をした方が良さそうです。

まとめ

presicionのデフォルト指定は、MySQLのバージョンアップデートに関する修正だったようです。