如何解释数据库中数字的精度和比例?
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=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
...
【讨论】:
请注意,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。
如果这有帮助,请告诉我!
【讨论】:
以上是关于如何解释数据库中数字的精度和比例?的主要内容,如果未能解决你的问题,请参考以下文章