0

なぜこれは

weightedValue = CAST(prob*value as FLOAT(53))/CAST(totalValue as FLOAT(53))

小数の答え全体を返しますが、これは

weightedValue = CAST(prob*value as DECIMAL(38,14))/CAST(totalValue as DECIMAL(38,14))

小数点第 6 位で切り捨てられた小数の回答を返しますか?

「Prob」は DECIMAL(16,14) として宣言され、「value」は DECIMAL(17,0) であり、「weightedValue」はすべて 10 進数値であり、合計値が DECIMAL(38,14) 仕様を超えないことを前提としています.

何かが欠けていない限り、DECIMAL(38,14) 表記は、最大 38 の合計数と最大 14 の小数精度を持つ値を与える必要があります。したがって、結果に切り捨てが発生することはありません。

さらに、以前は、浮動小数点演算に暗黙的に含まれる不正確さと結果に伴う不確実性に基づいて、FLOAT() を使用するよりも DECIMAL(,) を使用する方が常に好ましいと考えていました。その逆ではありません。私は何が欠けていますか、実際にはそうではありませんか?

4

1 に答える 1

1

問題は、SQL Server が Decimal 除算 (または乗算) を処理する方法にあります。

結果の精度の式は次のとおりです。

p1 - s1 + s2 + max(6, s1 + p2 + 1)

したがって、 がある場合DECIMAL(38,14)/DECIMAL(38,14)、次の精度が得られます。

38 - 14 + 14 + 最大 (6, 14 + 38 + 1) = 81

したがって、結果は、許容される (38,14) をはるかに超える DECIMAL(81,43) になります。したがって、SQL Server は自動的に回答を切り捨てます。

詳細な説明については、blogs.msdn.comを参照してください。

于 2012-08-17T00:20:59.407 に答える