如何解释数据库中数字的精度和比例?

Posted

技术标签:

【中文标题】如何解释数据库中数字的精度和比例?【英文标题】:How do I interpret precision and scale of a number in a database? 【发布时间】:2010-03-04 05:54:01 【问题描述】:

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

如何解释这一点?

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

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

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

附:我已经能够从一位同事那里确定正确的答案,但很难在网上找到答案。因此,我希望将问题和答案记录在 *** 上,以供将来参考。

【问题讨论】:

【参考方案1】:

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

即 1234567.89 的精度为 9

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

即 123456.789 的比例为 3

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

【讨论】:

不要忘记,如果您使用的系统允许您在 Microsoft Access 之类的软件中为百分比预定义输入的精度和比例,则必须将百分比视为整体数字形式。在这种情况下,25.5% 需要精度 4 和小数位数 3(不是 1),因为我们必须将其视为 0.255。我很早就遇到了这个问题,并且想知道为什么第 1 级不起作用。 @mezoid 负刻度值是什么意思? @Geek 根据technet.microsoft.com/en-us/library/ms187746.aspx 比例不能小于零。 0 @mezoid:并非所有数据库都如此;例如,在 Oracle 中:"What purpose could a negative scale fulfill? It allows you to round values to the left of the decimal place. Just as the NUMBER(5,2) rounded values to the nearest .01, so a NUMBER(5,-2) would round to the nearest 100..." 不应该是:“数值精度是指数字中可以存在的最大位数。”?确切的数字 123.5 也可以是精度 10,但没有更多数字要添加。还是会变成 123.5000000?【参考方案2】:

数字的精度是位数。

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

在字段定义上设置精度和比例时通常暗示它们代表最大值值。

例如,用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) => 可以被截断为 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 ...

【讨论】:

请注意,MS SQL Server 不允许使用 12345 或 1234.56,因为“[精度] 减去 [刻度] 以确定小数点左侧的最大位数。” (来源:decimal and numeric) 12345000 怎么样?精度 5 还是 8?如果是 5,用什么比例尺?比例 -3? 不错的答案,但为什么123450 (p=6,s=0) 超出范围? 123450 有 6 位数字,点后没有数字? @MatthiasBurger 123450 (p=6,s=0) 将超出精度为 5 的十进制字段的范围(如示例中所述)。因为要存储在字段中的数字的精度必须小于或等于字段的精度。 @DominikSeitz 啊谢谢,我误解了 boumbh 的答案。 123450 超出了(p=5,s=2) 的范围。我知道 123450 超出了(p=6,s=0) 的范围【参考方案3】:

Precision, Scale, and Length 在 SQL Server 2000 文档中写道:

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

【讨论】:

谢谢。我刚刚意识到一段 Delphi/Pascal 代码使用 0 的比例来截断浮点数的小数部分【参考方案4】:

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

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

如果这有帮助,请告诉我!

【讨论】:

以上是关于如何解释数据库中数字的精度和比例?的主要内容,如果未能解决你的问题,请参考以下文章

验证数字精度/比例

无法理解 DBMS 中数值数据类型的精度和小数位数

使用 c# 设置自动计算数字的比例和精度

具有任意精度和一定比例的数字格式的 Oracle to_char 函数

Postgres 中数字数据类型的精度和小数位数是多少?

NSDecimalNumber 值的比例和精度