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

mez*_*oid 224 sql database precision decimal scale

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

怎么解释这个?

根据SQL Server Management Studio中查看的列上的属性,我可以看到它表示:十进制(数字精度,数字刻度).

精确度和规模在实际意义上是什么意思?

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

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

mez*_*oid 365

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

即1234567.89的精度为9

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

即123456.789的评分为3

因此,十进制(5,2)的最大允许值为999.99

  • 不要忘记,如果您使用的系统允许您在Microsoft Access等事物中预定义输入的精度和比例,则必须将百分比视为整数形式.在这种情况下,25.5%需要精度4和3级(不是一个),因为我们必须将其视为.255.我很早就遇到了这个问题,并且难以理解为什么1号秤不起作用. (14认同)
  • @mezoid:所有数据库都不是这样; 例如,在Oracle中:["负标度可以实现什么目的?它允许您将值舍入到小数点左边.正如NUMBER(5,2)舍入值到最接近的.01,所以一个数字( 5,-2)将舍入到最近的100 ..."](https://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:1619552483055) (4认同)

bou*_*mbh 81

数字的精度是位数.

数字的比例是小数点后的位数.

在字段定义上设置精度和比例时通常隐含的是它们代表最大值.

例如,使用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,因为"[scale]从[precision]中减去,以确定小数点左侧的最大位数." (来源:[十进制和数字](http://technet.microsoft.com/en-us/library/ms187746.aspx)) (5认同)
  • @DominikSeitz 啊谢谢,我误解了 boumh 的答案。123450 超出了“(p=5,s=2)”的范围。我知道 123450 超出了 `(p=6,s=0)` 的范围 (3认同)
  • 很好的答案,但为什么“123450 (p=6,s=0)”超出范围?123450有6位数字,点后没有数字? (2认同)
  • @MatthiasBurger `123450 (p=6,s=0)` 将超出精度为 5 的十进制字段的范围(如示例中所述)。因为要存储在字段中的数字的精度必须小于或等于该字段的精度。 (2认同)

Chr*_*ris 23

SQL Server 2000文档中的Precision,Scale和Length读取:

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