各バージョンごとのdecimalタイプの設定内容
結論から先に書くと、precision は数値全体の桁数、scale は小数点以下の桁数を表します。例えば decimal(18,2) なら「全体で18桁、そのうち小数点以下が2桁」という意味になり、整数部には16桁まで格納できます。金額を扱う price02 や tax でこの指定が使われているのは、丸め誤差なく小数を保持したいからです。
テーブルの定義ファイルを見てみると、price02やtaxなど金額関係のカラムにはdecimal型が使われていることが分かります。
3系の場合、ProductClass.dcm.ymlに下記のように記載があります。
price02:
type: decimal
nullable: false
precision: 10
scale: 0
4系ではEntity(ProductClass.php)に直接アノテーションとして記載されています。
/**
* @var string
*
* @ORMColumn(name="price02", type="decimal", precision=12, scale=2)
*/
private $price02;
3系と4系で precision と scale の値が変わっている点に注目してください。3系は precision 10 / scale 0 なので整数10桁まで、4系は precision 12 / scale 2 なので整数10桁+小数2桁までを保持できます。他のカラムの定義には見かけない precision と scale という設定ですが、decimal 型ではこの2つがカラムの表現範囲を決める重要なパラメータになります。
precisionとscaleとは?
precision とは全体の桁数、scale とは小数点以下の桁数を表します。price02(3系)の例では全体で最大10桁、小数点以下は0桁ということになります。整数部に使える桁数は「precision − scale」で計算でき、4系の precision 12 / scale 2 なら整数部は10桁、小数部は2桁となります。
MySQL でも Doctrine でも記法は共通で、DECIMAL(precision, scale) の順に指定します。したがって DECIMAL(3,2) は「全体3桁・小数2桁」=整数部1桁・小数部2桁を意味し、格納できる範囲は -9.99〜9.99 です。もし「整数3桁+小数2桁」を格納したいなら DECIMAL(5,2)(例: 123.45)と指定する必要があります。precision と scale のどちらが先か迷ったときは、必ず precision(全体)→ scale(小数)の順と覚えておくとよいでしょう。
なお scale は precision 以下でなければならず、scale を省略すると 0(小数なし)として扱われます。指定した scale を超える小数はデータベース側で丸められるため、金額計算では扱いたい小数桁を意識して scale を決めることが大切です。
参考:https://stackoverflow.com/questions/14940574/what-do-scale-and-precision-mean-when-specifying-a-decimal-field-type-in-doctrin
おわりに
decimal は金額のように誤差が許されない計算で使う型で、float や double と違って指定した桁数を正確に保持できるのが特長です。EC-CUBE のようにお金を扱うシステムには必須の型と言えるため、precision と scale の意味を正しく理解したうえでカラムを設計してみてください。
EC-CUBEに関するお問い合わせ
[重要]現在公式にセキュリティサポートが切れていないPHPは8.1以上、MySQLは8.0以上で、対応しているEC-CUBEバージョンは4.2以上です。古いEC-CUBEを使っている方は適切なタイミングでバージョンアップをご検討ください。
EC-CUBEゴールドパートナー