2010-11-16 46 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