2011-07-08 15 views
9

MSDNは精度とscale of decimal multiplicatuion resultについて言う:T-SQL小数点乗算

  • 結果精度が38より大きい場合、結果の精度とスケールが38の絶対的な最大値を有する、対応するスケールに縮小されます結果の整数部分が切り捨てられないようにします。

そこで我々はこれを実行すると:結果は1.12345689000000000(9ゼロ)である

DECLARE @a DECIMAL(18,9) 
DECLARE @b DECIMAL(19,9) 

set @a = 1.123456789 
set @b = 1 

SELECT @a * @b 

を、我々はそれが切り捨てられていないことがわかるので、18 + 19 + 1 = 38(最大限界)。

@aの精度を27に上げると、すべてのゼロが失われ、結果はちょうど1.123456789になります。さらに、切り捨てを行い、結果を丸めます。たとえば、@ aの精度を28に設定すると、1.12345679(8桁)になります。

興味深いことに、ある時点で30に等しい精度で、1.123457があり、この結果はそれ以上変化しません(切り捨てられなくなります)。

31,32および38までの結果が同じです。どのようにこれを説明することができますか?

+0

私はちょうど推測を思いついた:多分sum()関数を使用すると、ユーザーが小数点以下を(カンマの後の数字)を失うのを防ぐために行われた。同じゼロでないs(またはs> = 2の場合でもs-1)で任意の小数を乗算した後、常に10進(38、s)を返し、適切な結果を与えません(非整数値を得る意味で) )。しかし、このケースでは6桁の「予約済み」が、まだ驚くように見えます。おそらく、このテーマに関するいくつかのドキュメント? – Ilya

答えて

4

小数点と数値の演算結果の最小位取りは6です。これは除算のためのmsdnドキュメントの表で指定されていますが、例のように位取りが切り捨てられた場合でも同様の動作が乗算に適用されます。

この動作の詳細については、sqlprogrammability blogを参照してください。

関連する問題