自分用メモです。
SQL Server を利用して正確な金額計算を行う場合、SQL のデータ型は float 型や real 型を使用すると値が切り捨てられたり丸めたりされるため、0.1円単位で正確な計算を行わなければならない用途では使うことはできません。
金額計算を行う場合、SQL のデータ型は money(smallmoney) 型または decimal(numeric) 型を使用します。
ですが、金額であることを明示するため、金額のデータ型には money 型を使用し、パーセントなどの定数または変数の場合は decimal 型を使用するなど、使い分けるほうがよいでしょう。
また、金額計算を行うためにあらかじめ知っておかなければならない予備知識として、以下のことが挙げられます。
1.money 型と smallmoney 型の有効範囲
money(8バイト):-922,337,203,685,477.5808 ~ 922,337,203,685,477.5807
smallmoney(4バイト):– 214,748.3648 ~ 214,748.3647
※money データ型と smallmoney データ型は、表している通貨単位の 10,000 分の 1 までの精度を持ちます。
2.decimal 型の最大有効桁数は、整数部と小数部の合計が38桁以下になる必要があります。
※有効桁数が38桁を超えた場合、整数部での切り捨てが発生しないように小数部の有効桁数が丸められます。
3.decimal 型同士での計算を行う場合、有効桁数がどのように変化するかを知っておく必要があります。
※NUMERIC/DECIMAL の演算結果の精度とスケールの決定方法
4.Transact-SQL ステートメントでは、小数点の付いた定数は、必要最小限の有効桁数と小数点以下桁数で自動的に numeric 型の値に変換されます。たとえば、定数 12.345 は有効桁数が 5、小数点以下桁数が 3 の numeric 型に変換されます。
上記を踏まえ、金額計算を行う場合には切り捨てや丸めができる限り発生しないよう、金額データ同士の加減算と金額以外の定数や変数の計算は別に計算を行った後、最後にまとめて計算を行うなどの工夫が必要になる場合があります。
コメントを残す
コメントを投稿するにはログインしてください。