我有一个包含10位整数的表,并且考虑通过将它们存储为BINARY_FLOAT来加速Oracle中的查询/数学运算。这比NUMBER更加CPU友好,并且不会占用太多空间(我认为),这意味着内存中会有更多数据。
然而,看起来BINARY_FLOAT为两个不同的数字产生相同的字节(因而也就是值)......这显然不起作用。
示例:
SQL> select dump(to_binary_float(25185387)) from dual;
DUMP(TO_BINARY_FLOAT(2518538
----------------------------
Typ=100 Len=4: 203,192,38,54
SQL> select dump(to_binary_float(25185388)) from dual;
DUMP(TO_BINARY_FLOAT(2518538
----------------------------
Typ=100 Len=4: 203,192,38,54
SQL> CREATE TABLE blah ( somenum BINARY_FLOAT );
Table created.
SQL> insert into blah (somenum) values (25185387);
1 row created.
SQL> insert into blah (somenum) values (25185388);
1 row created.
SQL> select somenum from blah;
SOMENUM
----------
2.519E+007
2.519E+007
SQL> select to_number(somenum) from blah;
TO_NUMBER(SOMENUM)
------------------
25185388
25185388
SQL> select dump(somenum) from blah;
DUMP(SOMENUM)
------------------------------------------------------------------------------------------------------------------------
Typ=100 Len=4: 203,192,38,54
Typ=100 Len=4: 203,192,38,54
我预计如果我进入浮点状态,我可能会遇到一些问题,但这些都是整数。我尝试了各种咒语 - 25185387f,25185387.0,25185387 * 1.0,to_number(25185387)等。
当我阅读文档时,BINARY_FLOAT应存储到1.79e308,因此它不能成为舍入问题。
我在64位平台上使用Oracle 11.2.0.3。
想法?感谢。
答案 0 :(得分:3)
由于oracle的实现是BINARY_FLOAT标准ieee 754. BINARY_FLOAT与singe相同。
单个只有23位有效位。
25185387 = 11000000001001100011010 11 (长度= 25)
25185388 = 11000000001001100011011 00 (长度= 25)
因此,这些oracle轮次的重要性,丢弃最低有效位25185387~11000000001001100011011 * 2 ^ 2
25185388~11000000001001100011011 * 2 ^ 2
所以得到相同的值