SQL Server 2008 - 无法理解十进制

时间:2012-03-07 17:26:01

标签: sql-server

我需要将带小数的数字插入SQL Server 2008数据库。似乎decimal()是要使用的正确数据类型,但是,我无法完全理解它。

我找到了这个脚本(向下滚动到十进制):

http://www.sqlteam.com/forums/topic.asp?TOPIC_ID=95322

这允许我针对数字测试不同的小数设置,并且有一些我不明白为什么它们通过或失败。我理解它的方式,当使用十进制(精度,标度)时,精度是小数点左边的位数,scale是小数点右边的位数。使用这个函数,我不明白为什么有些人正在传递,为什么有些人失败了。

SELECT dbo.udfIsValidDECIMAL('2511.1', 6, 3)    

我左边有4个数字,右边有1个数字,但是这个数字失败了。

SELECT dbo.udfIsValidDECIMAL('10.123456789123456789', 18, 17)    
SELECT dbo.udfIsValidDECIMAL('10.123456789123456789', 18, 16)

第一个失败,第二个失败。小数点后面有18位数字,所以看起来两者都应该失败(或传递和SQL截断数字)。

也许我对decimal()的工作原理有一个基本的误解?

3 个答案:

答案 0 :(得分:4)

DECIMAL(6,3)表示:总共6位数,其中3位在小数点右侧。

所以你有3位数字,小数点后3位数,当然它不能处理2511.1 - 小数点左边有四个数字。你需要DECIMAL(7,3)来处理它。

请参阅MSDN documentation on DECIMAL

  

十进制[(p [,s])]和数字[(p [,s])]

     

p(精确度)

     

小数点左侧和右侧可以存储的最大小数位数。精度   必须是从1到最大精度为38的值   默认精度为18.

     

s(比例)

     

可以存储在小数点右侧的最大小数位数。比例必须是从0到p的值。   只有在指定精度时才能指定比例。默认   比例为0;因此,0 <= s <= p。最大存储大小因基础而异   关于精度。

答案 1 :(得分:2)

精确度是指总共可以存储的位数。

因此,小数点左边的数字将是精度 - 比例。

例如,您的第一个示例将失败,因为您只允许小数点左边的三个位置:

SELECT dbo.udfIsValidDECIMAL('2511.1',6,3)

答案 2 :(得分:1)

cast(10.123456789123456789 as decimal(18,17))

精度为18&amp;等级17允许小数点左边只有1位数,但在这个例子中有2位。

cast(10.123456789123456789 as decimal(18,16)

有2位数的空间,所以成功。