Oracle BINARY_FLOAT:2个整数给出相同的值?

时间:2012-02-17 07:29:22

标签: oracle oracle11g

我有一个包含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。

想法?感谢。

1 个答案:

答案 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

所以得到相同的值