Firebird数据库
Firebird语言参考-定点类数据类型
2016-04-25 15:49:43

 

定点数据类型确保乘法和除法操作的可预测性,可以使用它们的选择存储货币值。Firebird实现两个定点数据类型:数值( NUMERIC)和小数(DECIMAL)。根据标准,这两种类型将存储数据限定为声明的小数(数量数字后的数字小数点)。

 

不同的处理方法对各类型的精度都有不同的限制:数值列的精度完全是“声明的",尽管十进制列接受数据的精度至少等于它被声明的精度。

 

例如,DECIMAL(4,2)定义了一个数值,其中包括了四个数字,包括2位小数点数字,即可以有2位数字在小数点前面和不超过2位数字在小数点面。如果将3.1415号写入到该数据类型定义的列,则将保存3.14的值在DECIMAL(4,2)列。

 

定点数据声明的形式,例如,NUMERIC(p, s)是两种类型中常见的,必须意识到在这个模板中的s参数的重要性,而不仅是“小数点后的位数”。理解这种机制来存储和检索定点数据应该可以帮助想象为什么:存储的数值乘以10的s次方(10的指数为s)转换后的整数,当阅读时整数被转换回来,将它转换为一个整数。

 

这种在数据库管理系统中存储定点数据的方式依赖于几个因素:声明的精度,数据库方言,声明的类型.

表3.2物理存储为实数的方法
 

 

 

数据声明格式t:

 

NUMERIC(p, s)

 

存储例子: 进一步解释上述,DBMS将根据声明的精度(p)和小数位数(s)来存储数值型数据据。更多的一些例子如:

 

NUMERIC(4) 作为 SMALLINT (准确的数据)存储
NUMERIC(4,2) 作为 SMALLINT (数据乘以10的2次方)存储
NUMERIC(10,4) 在方言1中以 DOUBLE PRECISION存储
                         在方言1中以 BIGINT (数据乘以10的4次方)存储

 

 

永远记住,存储格式取决于精度。例如,假设你定义一个列的类型为NUMERIC(2,2),它的值范围将是-0.99...0.99.然而实际值范围将是-327.68...327.67,这是因为存储NUMERIC(2,2) 数据类型在 SMALLINT 中,实际上在存储NUMERIC(4,2), NUMERIC(3,2) 和 NUMERIC(2,2)数据类型都是一样的。这就意味着如果你真的想存储在数据列NUMERIC(2,2)的数据范围在 -0.99...0.99之间,你将不得不为它建立一个约束。

 

 

数据声明格式t:

 

DECIMAL(p, s)

 

存储例子: 小数型存储在数据库中的格式同数值型非常相似,在一些例子的帮助下容易观察到它们的不同之处:

 

DECIMAL(4) 作为 INTEGER (准确的数据)存储
DECIMAL(4,2) INTEGER (数据乘以10的2次方)存储
DECIMAL(10,4) 在方言1中以 DOUBLE PRECISION存储
                        在方言1中以 BIGINT (数据乘以10的4次方)存储