1.Oracle的单精度和双精度浮点数
结尾无F/f/D/d的是NUMBER类型。 F/f结尾的是BINARY_FLOAT,占32位,是单精度浮点数字数据类型。 D/d结尾的是BINARY_DOUBLE,占64位,是双精度浮点数字数据类型。
语法说明:
- +或-表示正值或负值。如果省略符号,则为默认值。
- 数字是0-9之一
- E或e表示数字以科学计数法表示。E后边的数字表示指数。指数的范围从-130到125。
- F或f表示BINARY_FLOAT,该数字是32位单精度浮点数字数据类型。
- D或d表示BINARY_DOUBLE,该数字是64位双精度浮点数字数据类型。
- 如果省略F/f或D/d,则数字类型是NUMBER。
- 后缀F/f或D/d仅支持在浮点数常量中使用,不支持在被转换成NUMBER的字符串中使用。比如,当遇到字符串'9',Oracle如果想要一个NUMBER数值,则会将它转换成数字9,但当遇到'9f'时,Oracle则会转换失败并返回错误。
SQL> create table aa as select -6.123456789012 as a, 25e-06 as b, 123456789e-9f as c, 1.1234567890123456789d as d from dual;
Table created.
SQL> insert into aa values('11.1','22.1234567890',1.1f,2.2d);
1 row created.
SQL> insert into aa values('11.1','22.1234567890','1.1f','2.2d');
insert into aa values('11.1','22.1234567890','1.1f','2.2d')
*
ERROR at line 1:
ORA-01722: invalid number
SQL> insert into aa values('11.1f','22.1234567890',1.1f,2.2d);
insert into aa values('11.1f','22.1234567890',1.1f,2.2d)
*
ERROR at line 1:
ORA-01722: invalid number
SQL> select * from aa;
A B C D
---------- ---------- ---------- ----------
-6.1234568 .000025 1.235E-001 1.123E+000
11.1 22.1234568 1.1E+000 2.2E+000
SQL> describe aa ;
Name Null? Type
----------------------------------------- -------- ----------------------------
A NUMBER
B NUMBER
C BINARY_FLOAT
D BINARY_DOUBLE
SQL> SELECT 1.0f a FROM DUAL;
A
----------
1.0E+000
用JDBC连接Oracle,执行
create table aa as select -6.123456789012 as a, 25e-06 as b, 123456789e-9f as c, 1.1234567890123456789d as d from dual;select * from aa;
结果:
A B C D
---------- ---------- ---------- ----------
-6.123456789012 0.000025 1.12345679 1.1234567890123457
结论:
浮点数前可加+和-,表示正负数值。
支持科学计数法的形式。
浮点数后边添加F/f表示单精度浮点数,添加D/d表示双精度浮点数,不加F/f或D/d,表示是NUMBER类型。
后缀F/f或D/d仅支持在浮点数常量中使用,不支持在被转换成NUMBER的字符串中使用。
Oracle单精度和双精度的浮点显示精确到小数点后几位,跟客户端有关。
2.KES的浮点数
test=# create table TEST1 as select 1e-1 as a, 25e-06 as b, -1.123 as c, 1.1234567890123456789 as d;
SELECT 1
test=# select * from TEST1;
a | b | c | d
-----+----------+--------+-----------------------
0.1 | 0.000025 | -1.123 | 1.1234567890123456789
(1 row)
test=# \d aa;
Table "public.aa"
Column | Type | Collation | Nullable | Default
--------+---------+-----------+----------+---------
a | numeric | | |
b | numeric | | |
c | numeric | | |
d | numeric | | |
KES V9R1支持以科学计数法表示定点数。
test=# SELECT +6.34F;
f
------
6.34
(1 row)
test=# SELECT 1.0f a;
ERROR: syntax error at or near "a"
LINE 1: SELECT 1.0f a;
KES V9R1不支持用F/f/D/d后缀的方式表示单精度或者双精度浮点数,而是当做列别名显示了。
test=# create table aa(a NUMBER(38,8), b NUMBER(38,8), c BINARY_FLOAT, d BINARY_DOUBLE);
CREATE TABLE
test=#
test=# insert into aa values(25e-03,'22.1234567890', 25e-03f,2.2d);
ERROR: syntax error at or near "f"
test=# insert into aa values( 25e-03,'22.1234567890', 25e-03,2.2);
test=# select * from aa;
a | b | c | d
-----------------+-----------------+------+-----
0.02500000 | 22.12345679 | 0.025 | 2.2
(1 row)
test=# \d aa;
Table "public.aa"
Column | Type | Collation | Nullable | Default
--------+------------------+-----------+----------+---------
a | numeric(38,8) | | |
b | numeric(38,8) | | |
c | real | | |
d | double precision | | |
KES V9R1支持创建BINARY_FLOAT、BINARY_DOUBLE类型的列。
3.差异分析
KES已有功能:
1、用+或-表示正值或负值。如果省略符号,则为默认值。
2、数字是0-9之一
3、E或e表示数字以科学计数法表示。E后边的数字表示指数。
4、如果省略F/f或D/d,则数字类型是numeric。
KES需新增的功能:
1、F或f表示BINARY_FLOAT类型,存储单精度的32位浮点数。
2、D或d表示BINARY_DOUBLE类型,存储双精度的64位浮点数。