2010.12.14 关于decimal和Numeric类型
decimal:从-10^38到10^38-1的定精度与有效位数的数字
numeric:decimal的同义词
怎么理解Numberic类型呢?
Decimal数据类型,语法为:Decimal(P,S),P为精度,s为数字的小数位数
DECIMAL数据类型可以提供小数所需要的实际存储空间,但也有一定的限制。您可以用2 到17 个字节来存储从-1038-1 到1038-1 之间的数值(这句话不知道什么意思?),可将其写为DECIMAL[p ,s]的形式,p 和s 确定了精确的比例和数位。
其中p 表示可供存储的值的总位数,不包括小数点,缺省值为18。
s 表示小数点后的位数,缺省值为0。 例如decimal [15 5]。表示共有15 位数,其中整数10 位,小数5 位。也就是说,S用于小于等于P.
decimal 数据类型最多可存储 38 个数字,所有数字都能够放到小数点的右边。什么意思呢,就是说,假如定义numeric[18,8],那么能够表达的最大数是
10位 8位
999999999.99999999
decimal 数据类型有什么好处呢,就是相对于float类型,decimal存储了一个准确(精确)的数字表达法;不存储值的近似值。
在Sqlserver2005中做测试,假如设置p>38,则系统提示,精度必须<=38。那么这个38是从哪里来的呢?(这个38应该就是系统设定的)
为什么说“您可以用2 到17 个字节来存储从-1038-1 到1038-1 之间的数值”?
想想,decimal最多可存储38个数字,那么这38个数字的最大值是多少呢?9999999999....(一个38个9),那么需要用多大的空间来表达这38个9呢?大概需要17个字节。17个字节,17*8=136为,2的136次方,大约就是8.7e+40,e+40,表示10的40次方,大概是40位。
这样就明白上面这句话了,1038是指10的38次方。其实是这句话错了。
表4-3 列出了各精确度所需的字节数之间的关系表 DECIMAL数据类型的精度与字节数
精度 字节数
1 ~ 2 2
3 ~ 4 3
5 ~ 7 4
8 ~ 9 5
10 ~ 12 6
13 ~ 14 7
15 ~ 16 8
17 ~ 19 9
20 ~ 21 10
22 ~ 24 11
25 ~ 26 12
27 ~ 28 13
29 ~ 31 14
32 ~ 33 15
34 ~ 36 16
37 ~ 38 17