如何解释数据库中数字的精度和小数位数?


245

我在数据库中指定了以下列:decimal(5,2)

如何解释这一点?

根据在SQL Server Management Studio中查看的列上的属性,我可以看到它的意思是:十进制(数字精度,数字小数位数)。

精度和比例在实际意义上是什么?

将其解释为带有5位数字和两位小数的十进制很容易...即12345.12

附言:我已经能够确定同事的正确答案,但是很难在网上找到答案。因此,我想在这里将问题和答案记录在stackoverflow上,以备将来参考。

Answers:


396

数值精度是指数字中存在的最大位数。

即1234567.89的精度为9

数字刻度是指最大小数位数

即123456.789的比例为3

因此,decimal(5,2)的最大允许值为999.99


14
别忘了,如果您使用的系统可以为Microsoft Access之类的百分比预定义输入的精度和小数位数,则必须将百分比视为整数形式。在这种情况下,因为我们必须将其视为.255,所以25.5%的精度需要4的精度和3的小数位(不是1)。我很早就遇到了这个问题,并困惑了片刻,想知道为什么1级不起作用。
Ashton Sheets 2013年

1
@mezoid负比例值是什么意思?
极客

@Geek根据technet.microsoft.com/zh-cn/library/ms187746.aspx,比例不能小于零。0 <=刻度<=精度。本质上,负比例值将毫无意义。
mezoid


1
不是吗:“数字精度是指数字中可以出现的最大位数”。确切的数字123.5也可以是精度10,但是没有其他数字可添加。还是会变成123.5000000?
Chris311

86

数字的精度是位数。

数字的小数位数是小数点后的位数。

在字段定义上设置精度和小数位数时,通常隐含的是它们代表最大值

例如,用precision=5和定义的十进制字段scale=2将允许以下值:

  • 123.45 (p = 5,s = 2)
  • 12.34 (p = 4,s = 2)
  • 12345 (p = 5,s = 0)
  • 123.4 (p = 4,s = 1)
  • 0 (p = 0,s = 0)

以下值是不允许的,否则将导致数据丢失:

  • 12.345(p = 5,s = 3)=>可以被截断为12.35(p = 4,s = 2)
  • 1234.56(p = 6,s = 2)=>可以被截断为1234.6(p = 5,s = 1)
  • 123.456(p = 6,s = 3)=>可以被截断为123.46(p = 5,s = 2)
  • 123450 (p = 6,s = 0)=>超出范围

请注意,范围通常由精度定义:|value| < 10^p...


5
请注意,MS SQL Server不允许使用12345或1234.56,因为“ [scale]是从[precision]减去以确定小数点左边的最大位数”。(来源:十进制和数字
molnarm

怎么12345000样 精度5还是8?如果5,用什么尺度?规模-3?
towi 2015年

@towi是什么意思?如果要存储,则使用8,0。
罗布·格兰特

好的答案,但是为什么123450 (p=6,s=0)超出范围?123450有6位数字,点后没有数字?
Matthias Burger '18

1
@MatthiasBurger 123450 (p=6,s=0)对于5精度的十进制字段将超出范围(如示例中所述)。因为要存储在字段中的数字的精度必须小于或等于该字段的精度。
Snozzlebert

26

SQL Server 2000文档中的精度,小数位数和长度为:

精度是数字中的位数。小数位数是数字中小数点右边的位数。例如,数字123.45的精度为5,小数位数为2。


谢谢。我只是意识到一段Delphi / Pascal代码使用0的小数位数来截断float的小数部分
peterchaula
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.