我有一个充满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
所以得到相同的值