2016-11-22 5 views
2

精度は、10進数を返すようにnumとdenominatorの両方を10進数としてキャストしなければならない理由ですか?そして、最初の&の2番目のステートメントはなぜ異なる精度をもたらすのですか?どちらも1つの部分だけをキャストします。分割のためにnumとdenomの両方をキャストする理由はありますか?

そして、両方をdecimal(12,4)にキャストする代わりに、分母をより高い精度でキャストしないでください。例えば

select 3/cast(2 as decimal(12,4)) 
select cast(3 as decimal(12,4))/2 
select cast(3 as decimal(12,4))/cast(2 as decimal(12,4)) 
select 3/cast(2 as decimal(16,4)) 

RETURNS 
1.5000000000000 
1.500000 
1.50000000000000000 
1.50000000000000000 
+3

注続きを読むことができます。また、なぜ除算が予想よりも精度が高いのかを知りたい場合は、[文書化されています](https://msdn.microsoft.com/library/ms190476)を参照してください。 –

答えて

1

これは、精度、スケール、長さ

精密に関連する番号の桁数です。

スケールは、数値の小数点以下の桁数です。

たとえば、123.45の精度は、5の精度と2の精度を持ちます。

次の表は、演算結果がdecimal型の場合に結果の精度と位取りをどのように計算するかを定義しています。次のいずれかが真の場合、結果は小数点になります。

  • 両方の式は小数です。
  • 1つの式は10進数で、もう1つは10進数よりも優先順位の低いデータ型です。

オペランド式は精度p2とスケールs2で、精度p1及びスケールs1、そして発現e2と、式e1として示されています。

小数点以外の式の精度と位取りは、式のデータ型に定義された精度と位取りです。

Operation || Result precision     || Result scale 
e1 + e2 || max(s1, s2) + max(p1-s1, p2-s2) + 1 || max(s1, s2) 
e1 - e2 || max(s1, s2) + max(p1-s1, p2-s2) + 1 || max(s1, s2) 
e1 * e2 || p1 + p2 + 1       || s1 + s2 
e1/e2 || p1 - s1 + s2 + max(6, s1 + p2 + 1) || max(6, s1 + p2 + 1) 
e1 % e2 || min(p1-s1, p2 -s2) + max(s1,s2) || max(s1, s2) 

あなたは3.0/2 'あなたに1つ、鋳造の必要はありませんを与えるあなただけの小数を、したい場合は、 `SELECTというこのMSDN article

関連する問題