首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL Server 2008 -无法理解小数

问SQL Server 2008 -无法理解小数
EN

Stack Overflow用户
提问于 2012-03-08 01:26:01
回答 3查看 2.3K关注 0票数 4

我需要在SQL Server 2008数据库中插入带小数的数字。似乎decimal()是要使用的正确数据类型,然而,我很难准确地理解它。

我找到了这个脚本(向下滚动小数):

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

这让我可以针对数字测试不同的小数设置,有些我不明白为什么它们会通过或失败。根据我的理解,当使用decimal (精度,小数位数)时,精度是小数位左边的位数,而小数位是小数右边的位数。使用这个函数,我不明白为什么有些会通过,为什么有些会失败。

代码语言:javascript
复制
SELECT dbo.udfIsValidDECIMAL('2511.1', 6, 3)    

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

代码语言:javascript
复制
SELECT dbo.udfIsValidDECIMAL('10.123456789123456789', 18, 17)    
SELECT dbo.udfIsValidDECIMAL('10.123456789123456789', 18, 16)

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

也许我对decimal()是如何工作的有一个根本的误解?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-03-08 01:33:38

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

所以小数点左边的数字将是精确小数位数。

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

代码语言:javascript
复制
SELECT dbo.udfIsValidDECIMAL('2511.1',6,3)
票数 2
EN

Stack Overflow用户

发布于 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。最大存储大小因精度而异。

票数 4
EN

Stack Overflow用户

发布于 2012-03-08 01:34:22

代码语言:javascript
复制
cast(10.123456789123456789 as decimal(18,17))

精度为18 &小数位数为17时,小数位左边只有1位数字,但在本例中有2位数字。

代码语言:javascript
复制
cast(10.123456789123456789 as decimal(18,16)

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9606289

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档