Referensi bahasa SQL mengatakan "Tipe data REAL adalah bilangan floating-point dengan presisi biner 63, atau 18 desimal", dan ditampilkan sebagai FLOAT(63). Dan FLOAT [(p)] adalah:
Jika Anda membuat tabel dengan kolom NYATA berperilaku seperti 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
Saya telah menggunakan nilai yang lebih kecil sehingga dapat ditampilkan dalam batas Pengembang SQL*Plus/SQL 49 digit untuk numformat. Perhatikan bahwa nilai FLOAT(126) dan NUMBER tidak sama persis dengan nilai tersebut.
PL/SQL sedikit berbeda. Dalam paket standar Anda dapat melihat:
type NUMBER is NUMBER_BASE;
subtype FLOAT is NUMBER; -- NUMBER(126)
subtype REAL is FLOAT; -- FLOAT(63)
Dalam blok PL/SQL REAL
. Anda variabel dapat mengambil nilai apa pun yang tidak dibatasi NUMBER
dapat dan memiliki efek skala/presisi yang sama; dalam hal ini hanya mempertahankan (38- 40)
digit, dan pembulatan sisanya menjadi yang terkecil dari 40 digit pertama tersebut. Keseluruhan 'ukuran' nilai Anda, sebagai angka 72 digit, dipertahankan, tetapi Anda kehilangan presisi melebihi apa yang dapat disimpan dalam format internal Oracle. Jika Anda memiliki tipe variabel yang sama seperti contoh tabel dan memasukkan nilai asli Anda ke dalam:
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
Perhatikan kali ini bahwa FLOAT dan NUMBER yang tidak dibatasi menunjukkan nilai yang sama, sedangkan FLOAT yang dibatasi memiliki presisi yang Anda harapkan.
Jadi ini menunjukkan nol setelah digit ke-40 dan digit ke-40 itu adalah 5 bukannya 4 karena Anda telah melampaui presisi dan nilainya dibulatkan ke digit yang paling signifikan. Tipe data SQL REAL memiliki presisi 63 biner atau 18 digit desimal; tetapi kecuali ditentukan, PL/SQL REAL cocok dengan NUMBER.