我需要在SQL Server 2008数据库中插入带小数的数字。似乎decimal()是要使用的正确数据类型,然而,我很难准确地理解它。
我找到了这个脚本(向下滚动小数):
http://www.sqlteam.com/forums/topic.asp?TOPIC_ID=95322
这让我可以针对数字测试不同的小数设置,有些我不明白为什么它们会通过或失败。根据我的理解,当使用decimal (精度,小数位数)时,精度是小数位左边的位数,而小数位是小数右边的位数。使用这个函数,我不明白为什么有些会通过,为什么有些会失败。
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()是如何工作的有一个根本的误解?
发布于 2012-03-08 01:33:38
精度是指总共可以存储的位数。
所以小数点左边的数字将是精确小数位数。
例如,您的第一个示例将失败,因为您只允许小数点左侧的三位:
SELECT dbo.udfIsValidDECIMAL('2511.1',6,3)发布于 2012-03-08 01:34:52
DECIMAL(6,3)表示:总共6位数字,其中3位在小数点右边。
所以你之前有3位数,小数点后有3位数,当然它不能处理2511.1 --小数点左边有4位位。你需要DECIMAL(7,3)来处理这个问题。
请参阅MSDN documentation on DECIMAL
decimal[ (p,s )]和numeric[ (p,s )]
精度p()
可以存储在小数点左侧和右侧的最大小数位总数。精度必须是从1到最大精度38之间的值。默认精度为18。
缩放%s()
可以存储在小数点右侧的最大小数位数。小数位数必须是从0到p的值。只有在指定了精度的情况下才能指定小数位数。默认小数位数为0;因此,0 <= s <= p。最大存储大小因精度而异。
发布于 2012-03-08 01:34:22
cast(10.123456789123456789 as decimal(18,17))精度为18 &小数位数为17时,小数位左边只有1位数字,但在本例中有2位数字。
cast(10.123456789123456789 as decimal(18,16)有2位数的空间,所以成功了。
https://stackoverflow.com/questions/9606289
复制相似问题