固定精度数:DECIMAL 和 MONEY

大多数商业应用程序存储的数字在小数点左右两边有固定位数。例如:美国货币金额写成小数点右边有两位。正常情况下,根据所记录的交易的类型,您还知道左边所需的位数:个人预算可能是 5 位,小企业可能是 7 位,国家预算可能是 12 或 13 位。

由于小数点固定在特定的位置(而无论数值是多少),所以这些数是定点数。DECIMAL(p,s) 数据类型旨在存放十进制数。当指定具有此类型的列时,您将其精度 (p) 写作它可以存储的总位数(从 1 到 32)。您将其小数位 (s) 写作位于小数点右边的那些位的数目。(下图显示了精度与小数位之间的关系。)小数位可以是零,表示只存储整数。当只存储整数时,DECIMAL(p,s) 提供了存储多达 32 位的整数的方法。

图: 定点数中的精度与小数位之间的关系


数据类型是 DECIMAL(8,3)。数值是 31964.535。精度为 8 位,小数点后的小数位为 3 位。

与 DECIMAL(p) 数据类型相似,DECIMAL(p,s) 占用的空间与其精度成正比。一个值占用 (p +3)/2 个字节(如果小数位是偶数)或 (p + 4)/2 个字节(如果小数位是奇数),并且上舍入至整数个字节。

除了具有一项额外的特征外,MONEY 类型与 DECIMAL(p,s) 完全相同。每当数据库服务器将 MONEY 值转换为字符以进行显示时,它将自动包括货币符号。

与 INTEGER 和 FLOAT 相比,DECIMAL(p,s) 的优点是精度可以高得多(最高 32 位,而 INTEGER 是 10 位,FLOAT 是 16 位),并且精度和所需的存储空间都可以调整,以与应用程序相适应。

DECIMAL(p,s) 的缺点是算术运算的效率较低,并且许多编程语言不支持此格式的数字。因此,当程序抽取数字时,它通常必须将该数字转换为另一数字格式才能进行处理。