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

How do I interpret precision and scale of a number in a database?

提问人:mezoid 提问时间:3/4/2010 最后编辑:fredtmezoid 更新时间:1/7/2022 访问量:383698

问:

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

如何解释这一点?

根据在 SQL Server Management Studio 中查看的列的属性,我可以看到它的意思是:decimal(Numeric precision, Numeric scale)。

精度和规模的实际含义是什么?

很容易将其解释为具有 5 位数字和 2 位小数的小数......即 12345.12

P.S. 我已经能够从同事那里确定正确答案,但很难在网上找到答案。因此,我希望将问题和答案记录在stackoverflow上,以备将来参考。

SQL 数据库 十进制 小数位数 精度

评论


答:

497赞 mezoid 3/4/2010 #1

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

IE 1234567.89 的精度为 9

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

IE 123456.789 的比例为 3

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

评论

22赞 Ashton Sheets 12/6/2013
不要忘记,如果您使用的系统允许您在 Microsoft Access 等中预定义百分比输入的精度和比例,则必须将百分比视为整数形式。在这种情况下,25.5% 需要精度 4 和 3 的刻度(不是 1),因为我们必须将其视为 .255。我很早就遇到了这个问题,并且被难住了一段时间,想知道为什么 1 级不起作用。
1赞 Geek 6/19/2014
@mezoid 负刻度值是什么意思?
1赞 mezoid 6/20/2014
@Geek 根据 technet.microsoft.com/en-us/library/ms187746.aspx 刻度不能小于零。0 < = 刻度 <= 精度。从本质上讲,负刻度值是没有意义的。
1赞 Chris311 12/29/2015
不应该是:“数字精度是指数字中可能存在的最大位数。确切的数字 123.5 也可能是精度 10,但没有更多的数字要添加。还是会变成 123.5000000?
37赞 Chris 11/20/2012 #2

SQL Server 2000 文档中的精度、小数位数和长度如下:

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

评论

0赞 Peter Chaula 8/10/2018
谢谢。我刚刚意识到一段 Delphi/Pascal 代码使用 0 的小数位数来砍掉浮点数的小数部分
114赞 boumbh 3/20/2013 #3

数字的精度是位数。

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

在字段定义上设置精度和小数位数时,通常意味着它们表示最大值。

例如,用 和 定义的十进制字段将允许以下值:precision=5scale=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) => 可以截断为 (p=4,s=2)12.35
  • 1234.56(p=6,s=2) => 可以截断为 (p=5,s=1)1234.6
  • 123.456(p=6,s=3) => 可以截断为 (p=5,s=2)123.46
  • 123450(p=6,s=0) => 超出范围

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

评论

6赞 molnarm 2/17/2014
请注意,MS SQL Server 不允许使用 12345 或 1234.56,因为“从 [精度] 中减去 [scale] 以确定小数点左侧的最大位数。(来源:十进制和数字)
0赞 towi 3/5/2015
怎么样 ?精度 5 还是 8?如果是 5,用什么规模?规模 -3?12345000
2赞 Matthias Burger 2/1/2018
不错的答案,但为什么超出范围?123450 有 6 位数字,一个点后没有数字?123450 (p=6,s=0)
3赞 domids 3/23/2018
对于精度为 5 的十进制字段,@MatthiasBurger将超出范围(如示例中所述)。因为要存储在字段中的数字的精度必须小于或等于字段的精度。123450 (p=6,s=0)
3赞 Matthias Burger 3/23/2018
@DominikSeitz啊,谢谢,我误解了 boumbh 的答案。123450 超出了 的范围。我知道 123450 超出了范围(p=5,s=2)(p=6,s=0)
1赞 Key 1/7/2022 #4

精度是指总位数,而小数位数是指小数点后允许的数字。 引用的示例的精度为 7,小数位数为 2。

此外,DECIMAL(precision, scale) 是一种精确值数据类型,与存储近似数值数据的 FLOAT(precision, scale) 不同。 例如,定义为 FLOAT(7,4) 的列显示为 -999.9999。MySQL在存储值时执行舍入,因此如果将999.00009插入FLOAT(7,4)列,则近似结果为999.0001。

如果有帮助,请告诉我!

评论

0赞 Arkemlar 10/6/2022
DECIMAL 是否像整数一样在内部存储,因此是精确类型?由于其内部表示(我记得),浮点值必须是近似值,并且在特定刻度数之后不能精确。