The SQL语言参考 http://docs.oracle.com/cd/E11882_01/server.112/e41084/sql_elements001.htm表示“REAL 数据类型是二进制精度为 63 或十进制 18 的浮点数”,显示为 FLOAT(63)。 FLOAT [(p)] 是:
NUMBER 数据类型的子类型,精度为 p。 FLOAT 值在内部表示为 NUMBER。精度 p 的范围可以是 1 到 126 个二进制数字。 FLOAT 值需要 1 到 22 个字节。
如果您创建一个包含 REAL 列的表,其行为类似于 FLOAT(63):
create table t42 (a real, b float(126), c float(63), d number);
insert into t42 (a, b, c, d)
values (123456789123456789123456789123456789123456789123456,
123456789123456789123456789123456789123456789123456,
123456789123456789123456789123456789123456789123456,
123456789123456789123456789123456789123456789123456);
select a, b, c, d from t42;
A
----------------------------------------------------------------
B
----------------------------------------------------------------
C
----------------------------------------------------------------
D
----------------------------------------------------------------
123456789123456789100000000000000000000000000000000
123456789123456789123456789123456789120000000000000
123456789123456789100000000000000000000000000000000
123456789123456789123456789123456789123000000000000
我使用了一个较小的值,因此它可以在 SQL*Plus/SQL Developer 的 numformat 49 位数字限制内显示。请注意,FLOAT(126) 和 NUMBER 值与该值并不完全相同。
PL/SQL 略有不同。在标准包中您可以看到:
type NUMBER is NUMBER_BASE;
subtype FLOAT is NUMBER; -- NUMBER(126)
subtype REAL is FLOAT; -- FLOAT(63)
在 PL/SQL 块中REAL
变量可以取任意值,不受限制NUMBER
可以并且具有相同的比例/精度效果;在这种情况下只保留最重要的(38-40) http://docs.oracle.com/cd/E11882_01/server.112/e41084/sql_elements001.htm#sthref118数字,并将其余数字四舍五入为前 40 位数字中的最小数字。值的整体“大小”(作为 72 位数字)会被保留,但会失去超出 Oracle 内部格式所能存储的精度。如果您具有与表示例相同的变量类型并将原始值放入:
DECLARE
A REAL := 123456789123456789123456789123456789123456789123456789123456789123456789;
B FLOAT(126) := 123456789123456789123456789123456789123456789123456789123456789123456789;
c FLOAT(63) := 123456789123456789123456789123456789123456789123456789123456789123456789;
D NUMBER := 123456789123456789123456789123456789123456789123456789123456789123456789;
BEGIN
DBMS_OUTPUT.PUT_LINE('A Value is : ' || A);
DBMS_OUTPUT.PUT_LINE('B Value is : ' || B);
DBMS_OUTPUT.PUT_LINE('C Value is : ' || C);
DBMS_OUTPUT.PUT_LINE('D Value is : ' || D);
END;
/
A Value is : 123456789123456789123456789123456789123500000000000000000000000000000000
B Value is : 123456789123456789123456789123456789120000000000000000000000000000000000
C Value is : 123456789123456789100000000000000000000000000000000000000000000000000000
D Value is : 123456789123456789123456789123456789123500000000000000000000000000000000
请注意,这次不受限制的 FLOAT 和 NUMBER 显示相同的值,而受限制的 FLOAT 具有您期望的精度。
因此,它在第 40 位数字之后显示零,并且第 40 位数字是 5 而不是 4,因为您超出了精度,并且该值被四舍五入到最高有效数字。 SQL REAL 数据类型的精度为 63 位二进制或 18 位十进制;但除非指定,否则 PL/SQL REAL 与 NUMBER 匹配。