質問
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をください
解決
乗算の場合、出力引数の桁を計算するために、各引数に小数点以下の桁数を加算するだけです(ペンと紙を使用)。
しかし、分裂はあなたの頭を吹き飛ばします。横になります。
ただし、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
他のヒント
簡単に言うと、DECIMAL(25,13)を使用すると、すべての計算で問題ありません-宣言どおりの精度が得られます。小数点以下12桁、小数点以下13桁です。 ルールは次のとおりです。p+ sは38に等しくなければなりません。 どうしてこれなの? SQL Serverでの算術の実装が非常に悪いためです! 修正するまで、そのルールに従います。
除算値を浮動小数点数にキャストすると、正しい答えが得られることに気づきました、つまり:
select 49/30 (result = 1)
なる:
select 49/cast(30 as float) (result = 1.63333333333333)
魔法の移行について困惑していました
P& Sはリンクされているので:
(72,54)-> (38,29)
(84,54)-> (38,8)
(38,29)
がタイプミスであり、(38,20)
であると仮定すると、次のようになります:
-
i。 72-38 = 34、 ii。 54-34 = 20
-
i。 84-58 = 46、 ii。 54-46 = 8
そしてこれが理由です:
i。出力精度から最大精度を引いた値は、破棄する数字です。
ii。次に、出力スケールを捨てると、出力スケールの残りの桁が残ります。
これが意味を成そうとしている他の誰かを助けることを願っています。
引数ではなく式を変換します。
select CONVERT(DECIMAL(38,36),146804871.212533 / 12499999.9999)
次を使用すると役立つ場合があります。
SELECT COL1 * 1.0 / COL2