1.简介
float:称为单精度浮点数,含字节数为4,是实数的 32 位近似值。数值范围为-3.4E38~3.4E38(7个有效位)
double:称为双精度浮点数,含字节数为8,是实数的 64位近似值。,数值范围-1.7E308~1.7E308(15个或16个有效位)
decimal:称为十进制数,是一种可以自己定义小数位数的压缩型十进制数。128bit,数值范围-7.9 × 10^28~7.9 × 10^28,常用于银行帐目计算。(28个或29个有效位)
decimal(a,b)说明:
decimal 数据类型最多可存储 38 个数字,所有数字都能够放到小数点的右边。 a指定指定小数点左边和右边可以存储的十进制数字的最大个数,最大精度38。 b指定小数点右边可以存储的十进制数字的最大个数。小数位数必须是从 0 到 a之间的值。默认小数位数是 0。
2.使用场景
2.1凡是跟钱相关的都需要使用 Decimal。
- Decimal 是精确存储
- float, double 是近似存储,并不精确
如果对于既要求精度,又固定小数点位数的数值存储,采用decimal(numeric),优点在于可以自定义小数点位数,精度高。
如特殊情况,如数值范围巨大只能用float(real)类型了,此类型一般不提倡使用。
2.2 能用单精度时不要用双精度(以省内存,加快运算速度)
double 和 float 的区别是double精度高,有效数字15位,float有效数字7位。但double消耗内存是float 的两倍,double的运算速度比float慢得多。
2.3 在 WHERE 子句搜索条件中(特别是 = 和 <> 运算符),应避免使用 float 或 real 列。最好限制使用 float 和 real 列做> 或 < 的比较。
float 类型本身是一种不精确的数据表示方法, 也就是说, 你放一个数据进去, 拿出来的时候可能会存在一点点点误差, 而这点点点误差在做数据比较的时候就会导致数据不一致.
3.3 float和double的相乘操作,数字溢出不会报错,会有精度的损失。当对decimal类型进行操作时,数值会因溢出而报错。
3.转换说明
从 decimal 或 numeric 向 float 或 real 转换会导致精度损失。
从 int、smallint、float、real向 decimal 或 numeric 转换会导致溢出。主要因为decimal的有效位数很大,但是表示的数据范围却比float和double类型小。
4.DECFLOAT类型
DECFLOAT 称为十进制浮点数,是DB2 V9.5 中引入的新数据类型,适合于处理准确的十进制业务。它具有 DECIMAL 类型的准确性,同时又具有浮点数的性能优势(也不需要指定小数位数),特别适合于在处理货币值相关的应用程序中使用。
DECFLOAT 提供 16 位和 34 位两种精度的浮点数据类型。分别为表示为 DECFLOAT(16) 和 DECFOAT(34)。如果没有指明精度,DECFLOAT 默认为 DECFLOAT(34)。这两种精度的数据分别存储在 8 字节和 16 字节的空间里。
CREATE TABLE EMPLOYEE ( SALARY DEC(14,2), BONUS DECFLOAT(16), COMMISSION DECFLOAT(34) ); INSERT INTO EMPLOYEE VALUES ( 123456.78, 1234567890.12, 123456789012345678901234.56 );
如果我们插入精度更大的数据,对于 BONUS 和 COMMISSION 这两列,我们不需要作任何更改,而对于 SALARY 列,那就需要修剪数据使得数据符合 DECIMAL 列指明的精度。结果如下:
INSERT INTO EMPLOYEE VALUES ( 123456.7891, 1234567890.1234, 123456789012345678901234.5678 );
5.源系统数据类型为decfloat如何入仓?
(1)STG可以定义为varchar(38),保持源数据接入。
(2)如果需要进行计算,可以在PDM转换为decimal后进行处理。为避免decimal数据溢出,尽量使用显示转换处理。需要注意根据实际需要定义精度,尽量避免精度损失。如果不需要计算,可以均定义为varchar(38)。