28

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をくれ

4

6 に答える 6

36

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

しかし、分裂はあなたの頭を吹き飛ばすだけです。私は今、横になりに行きます。

ただし、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
于 2009-01-08T12:12:36.840 に答える
19

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

于 2009-04-03T10:02:18.740 に答える
16

除算値を float にキャストすると、正しい答えが得られることに気付きました。

select 49/30                   (result = 1)

次のようになります。

select 49/cast(30 as float)    (result = 1.63333333333333)
于 2009-12-07T13:45:41.800 に答える
6

魔法の移行に戸惑いましたが、

P & S はリンクされているため、次のようになります。

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

(38,29)がタイプミスであり、 である と仮定すると(38,20)、次の計算になります。

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

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

そして、これが理由です:

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

ii. 次に、捨てるものを差し引いた出力スケールは、出力スケールの残りの桁数を示します。

これが、これを理解しようとしている他の人に役立つことを願っています。

于 2010-10-08T10:58:52.190 に答える
4

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

select  CONVERT(DECIMAL(38,36),146804871.212533 / 12499999.9999)
于 2009-01-08T11:56:47.497 に答える