mysql 5.1 には、2 つの列を含むテーブルがあります。
create table t1 {
price decimal(6,2),
quantity tinyint(4),
...
}
私がやっている選択クエリで
select sum(price * quantity)
from t1
group by ...
この計算は正確な計算ですか (固定小数点演算を使用)? または、丸め/精度の低下などを心配する必要がありますか?
mysql 5.1 には、2 つの列を含むテーブルがあります。
create table t1 {
price decimal(6,2),
quantity tinyint(4),
...
}
私がやっている選択クエリで
select sum(price * quantity)
from t1
group by ...
この計算は正確な計算ですか (固定小数点演算を使用)? または、丸め/精度の低下などを心配する必要がありますか?
計算結果は完全に良好で、精度を失うことはありません。
たとえば、ここを参照してください: http://sqlfiddle.com/#!2/173cf/1/0
しかし、tinyint(4) で問題が発生する可能性があります。(4)にもかかわらず、[-128、127]の範囲があります。こちらをご覧ください。http://dev.mysql.com/doc/refman/5.0/en/integer-types.html
小数と整数を掛けても正確な損失はないと思います。精度演算の例を参照してください。また、浮動小数点と小数の違いを確認するための小さな実験も行いました。
SELECT .1E0 * .1E0,
.1 * .1,
(.1E0 * .1E0) * 10,
(.1 * .1) * 10
出力は
0.010000000000000002 << .1E0 * .1E0
0.01 << .1 * .1
0.10000000000000002 << (.1E0 * .1E0) * 10
0.10 << (.1 * .1) * 10
精度が 2 の 10 進数を任意の整数 (int または tinyint) で乗算する場合、追加の精度が失われることを心配する必要はありません。結果の小数点以下の桁数は 2 桁までです。