2010-11-16 84 views
5

我遇到了sql server精度問題。SQL Server精確度瘋狂

我有以下疑問:

DECLARE @A numeric(30,10) 
DECLARE @B numeric(30,10) 
SET @A = 20.225 
SET @B = 53.3875 
SELECT @A * @B 

DECLARE @A1 numeric(30,14) 
DECLARE @B1 numeric(30,14) 
SET @A1 = 20.225 
SET @B1 = 53.3875 
SELECT @A1 * @B1 

DECLARE @A3 numeric(30,15) 
DECLARE @B3 numeric(30,15) 
SET @A3 = 20.225 
SET @B3 = 53.3875 
SELECT @A3 * @B3 

DECLARE @A2 numeric(20,15) 
DECLARE @B2 numeric(20,15) 
SET @A2 = 20.225 
SET @B2 = 53.3875 
SELECT @A2 * @B2 

DECLARE @A4 float 
DECLARE @B4 float 
SET @A4 = 20.225 
SET @B4 = 53.3875 
SELECT @A4 * @B4 

其中產量分別如下結果:

1079.762188

1079.762188

1079.7621875

1079.762187500000000000000000000

1079.7621875

正確答案是:1079.7621875。

我不明白爲什麼,當類型具有相同的簽名時,他們失去了精度。另外,爲什麼從30,14到30,15修正了精度問題?另外,爲什麼20,15有比30,15更多的小數?

我看了這篇文章http://msdn.microsoft.com/en-us/library/ms190476(SQL.90).aspx,我想我應該是很好的,因爲我的變量具有相同的精度。

任何幫助將不勝感激!

回答

2

答案在於計算機如何在內部表示數字。根據您使用的精度,SQL Server將分配5,9,13或17個字節來表示您的編號(請參閱http://msdn.microsoft.com/en-us/library/ms187746(v=SQL.90).aspx)。因此,例如,當您從精度30移至精度20時,內部表示從17字節移至13字節。如何設置一個17字節的數字和13個字節的數字,其中更大比例的數字表示專用於縮放(15/30 = 0.5,15/20 = 0.75,改變舍入行爲,沒有完美的答案。我們擁有的數字類型對於大多數應用程序來說已經足夠好了,但有時候會因爲我們在表示計算機中的數字而受到威脅時看到奇怪的工件。

另外,要非常非常小心的浮動類型。它們只是粗略的數字,在數量上使用時會給你錯誤的結果。對於大多數科學應用來說,當一次計算中使用的浮點數不超過20個時,它們非常出色。當用於數量時,比如說在一個總和(column_name)中加上100萬個浮點數,你會得到垃圾。下面演示:

DECLARE @f FLOAT 
DECLARE @n NUMERIC(20,10) 
DECLARE @i INT 

SET @f = 0 
SET @n = 0 
SET @i = 0 

WHILE @i < 1000000 
BEGIN 
    SET @f = @f + 0.00000001 
    SET @n = @n + 0.00000001 
    SET @i = @i + 1 
END 

SELECT @n as [Numeric], @f as [Float] 

這給我的SQL Server 2008。

Numeric  Float 
0.0100000000 0.00999999999994859 
3

這是在你粘貼鏈接的底部重要:

  • 結果精度和標有38的絕對最大當 結果精度大於38,相應的 規模減少到 防止結果 的組成部分被截斷。

對於所有,你必須爲30的精度的結果,所得到的計算精度是61由於最大精度可能是38減小所得到的精度提高23因此,所有的鱗片正在減少,以避免截斷結果的組成部分超過絕對必要。

的第二到最後一個值,其中每個值的精確度爲20,所得到的精度是41,其僅需要由3降低,留在標部分A可能打火機降低。

(30,15)的作品,因爲產生規模爲30,所以,當它被降低它仍然是大到足以容納你想要的值。

課:不要精度和比例的任何大的比你需要他們,否則你會得到奇怪的結果。

+0

甄子丹以下答案,我瞭解到,在(30,15)的結果是61和被減少到38.但是根據公式我看到它看起來像我的規模應該是-2或什麼的。什麼是公式來確定規模是什麼? – zgirod 2010-11-16 22:33:04