Справочник за SQL език казва „Типът данни REAL е число с плаваща запетая с двоична точност 63 или 18 десетични“ и се показва като FLOAT(63). И FLOAT [(p)] е:
Ако създадете таблица с колона 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 от 49 цифри за numformat. Забележете, че стойностите 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)
цифри и закръгляване на останалите до най-малкото от първите 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.