【Teradata SQL】float double decimal和Decfloat区别

时间:2022-09-15 15:27:43

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
);

【Teradata SQL】float double decimal和Decfloat区别

如果我们插入精度更大的数据,对于 BONUS 和 COMMISSION 这两列,我们不需要作任何更改,而对于 SALARY 列,那就需要修剪数据使得数据符合 DECIMAL 列指明的精度。结果如下:

INSERT INTO EMPLOYEE VALUES (
123456.7891,
1234567890.1234,
123456789012345678901234.5678
);

【Teradata SQL】float double decimal和Decfloat区别

 5.源系统数据类型为decfloat如何入仓?

(1)STG可以定义为varchar(38),保持源数据接入。

(2)如果需要进行计算,可以在PDM转换为decimal后进行处理。为避免decimal数据溢出,尽量使用显示转换处理。需要注意根据实际需要定义精度,尽量避免精度损失。如果不需要计算,可以均定义为varchar(38)。

 

 

Sql的decimal、float、double类型的区别

float、double(浮点数)区别还有和decimal(定点数)的比较

Decfloat百度百科

DB2 数据类型