我有一个充满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。

有想法吗?谢谢。

最佳答案

由于oracle的实现是BINARY_FLOAT标准ieee754。BINARY_FLOAT与singe相同。

单有效位只有23位。

25185387 = 11000000001001100011010 11(长度= 25)

25185388 = 11000000001001100011011 00(长度= 25)

因此,这些甲骨文回合的重要性,舍弃了最低有效位

25185387〜11000000001001100011011 * 2 ^ 2

25185388〜11000000001001100011011 * 2 ^ 2

所以得到相同的值

09-25 22:22