2009-01-08 124 views
16

有誰知道爲什麼,使用SQLServer的2005T-SQL十進制分割精度

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

+0

BTW Windows計算器給11.744389697096595117576772760941 – inspite 2009-01-08 11:53:18

回答

23

對於乘法,我們只需將每個參數中的小數位數加起來(使用筆和紙)來計算輸出dec位置。

但分裂只是把你的頭腦分開。我現在要躺下來了。

在SQL方面,雖然,它是exactly as expected.

--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) 

你可以做同樣的數學,如果遵循this rule過,如果你把每個數字對作爲

  • 146804871.212533000000000和12499999.999900000
  • 146804871.212533000000000和12499999.999900000000000
+0

謝謝。說實話,我用FLOAT來解決我的特殊問題(因爲我不需要100%準確),但是當我使用小數時會發生什麼事情,我很困惑。 – 2009-01-08 13:18:26

+1

不幸的是,SQL服務器在算術上非常糟糕:(所以,值得一提的是,如果你需要在t-sql中進行乘法和除法的精確結果,最好的選擇是:定義和使用CLR函數。 ://www.skylinetechnologies.com/Insights/Skyline-Blog/March-2013/CLR-Functions-in-SQL-Server-A-Tutorial for a good intro – 2016-03-19 21:36:40

2

轉換表達而不是爭論。

select CONVERT(DECIMAL(38,36),146804871.212533/12499999.9999) 
14

簡而言之,使用DECIMAL(25,13),所有計算結果都可以正常工作 - 您將得到如下聲明的精確度:小數點前12位數,後13位十進制數。 規則是:p + s必須等於38,你會安全的! 這是爲什麼? 由於SQL Server中的算術實現非常糟糕! 直到他們解決它,遵循該規則。

+0

是否有任何參考資料可以說明爲什麼這將是「罰款「對於所有計算? – MrEdmundo 2013-11-05 17:11:14

8

我已經注意到,如果你投的分割值浮動,它給你正確的答案,即:

select 49/30     (result = 1) 

將成爲:

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

我們琢磨不透的魔力過渡,

P & S被連接,所以:

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

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

假設(38,29)被一個錯字,並應(38,20),以下是數學公式:

  1. i。72 - 38 = 34, ii。 54 - 34 = 20

  2. i。 84 - 58 = 46, ii。 54 - 46 = 8

這是推理:

我。輸出精度減去最大精度是我們要扔掉的數字。

ii。然後輸出規模減去我們要扔掉的東西給我們......輸出比例中的剩餘數字。

希望這可以幫助其他人試圖理解這一點。

0

它可以幫助:

SELECT COL1 * 1.0/COL2