web-dev-qa-db-ja.com

T-SQL Decimal Division Accuracy

SQLServer 2005を使用して、誰かが理由を知っていますか

SELECT CONVERT(DECIMAL(30,15),146804871.212533)/CONVERT(DECIMAL (38,9),12499999.9999)

11.74438969709659をくれ、

しかし、分母の小数点以下の桁数を15に増やすと、正確性が低くなります。

SELECT CONVERT(DECIMAL(30,15),146804871.212533)/CONVERT(DECIMAL (38,15),12499999.9999)

11.74438969をください

24
MT.

乗算の場合は、各引数の小数点以下の桁数を(ペンと紙を使用して)加算するだけで、出力のdecの桁数を計算します。

しかし、分裂はあなたの頭を吹き飛ばすだけです。私は今、横になるために出発しています。

ただし、SQL用語では 予想どおり です。

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

--Scale = 15 + 38 + 1 = 54
--Precision = 30 - 15 + 9 + 54 = 72
--Max P = 38, P & S are linked, so (72,54) -> (38,20)
--So, we have 38,20 output (but we don use 20 d.p. for this sum) = 11.74438969709659
SELECT CONVERT(DECIMAL(30,15),146804871.212533)/CONVERT(DECIMAL (38,9),12499999.9999)


--Scale = 15 + 38 + 1 = 54
--Precision = 30 - 15 + 15 + 54 = 84
--Max P = 38, P & S are linked, so (84,54) -> (38,8)
--So, we have 38,8 output = 11.74438969
SELECT CONVERT(DECIMAL(30,15),146804871.212533)/CONVERT(DECIMAL (38,15),12499999.9999)

次のようにすれば、同じ計算を行うことができます このルール 、各数値ペアを次のように扱う場合も=

  • 146804871.212533000000000および12499999.999900000
  • 146804871.212533000000000および12499999.999900000000000
30
gbn

簡単に言えば、DECIMAL(25,13)を使用すると、すべての計算で問題ありません。宣言されたとおりの精度が得られます。小数点の前に12桁、その後に13桁の10進数が表示されます。ルールは次のとおりです。p+ sは38に等しくなければならず、安全です。どうしてこれなの? SQL Serverでの算術の実装が非常に悪いためです!彼らがそれを修正するまで、そのルールに従ってください。

15
Vedran Kesegic

分周値を浮動小数点にキャストすると、正しい答えが得られることに気づきました。

select 49/30                   (result = 1)

になるでしょう:

select 49/cast(30 as float)    (result = 1.63333333333333)
12
sonal

私たちは魔法の移行について戸惑っていました、

PとSはリンクされているので、

  1. (72,54)->(38,29)

  2. (84,54)->(38,8)

(38,29)はタイプミスであり、(38,20)、以下は数学です:

  1. 私。 72-38 = 34、ii。 54-34 = 20

  2. 私。 84-58 = 46、ii。 54-46 = 8

そしてこれは推論です:

私。出力精度から最大精度を差し引いた値が、破棄する数字です。

ii。次に、出力スケールから、これから捨てるものを差し引いて、出力スケールの残りの桁数を求めます。

これがこれを理解しようとしている他の人を助けることを願っています.

4
Campey

引数ではなく式を変換します。

select  CONVERT(DECIMAL(38,36),146804871.212533 / 12499999.9999)
3
cmsjr