我有一張滿10位整數的表格,並且認爲通過將它們存儲爲BINARY_FLOAT可以加快Oracle中的查詢/數學運算速度。這比NUMBER更友善,不會佔用太多空間(我認爲),這意味着更多的內存數據。Oracle BINARY_FLOAT:2個整數給出相同的值?
但是,看起來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文檔... http://docs.oracle.com/cd/E11882_01/server.112/e26088/sql_elements001.htm#i140176 ...說一個BINARY_FLOAT有一個3.40282E + 38F的「最大正的有限值」(我之前誤解了)。 所以我假設我可以存儲一個數字達到這個大小。現在我明白你的意思了。 那麼我可以存儲的最大整數是2^23? 再次感謝您的好評。 – raindog308 2012-02-17 18:25:29
2^23沒有失去精度。四捨五入隨着增加而發生。指定位以[規範化形式]保存(http://en.wikipedia.org/wiki/Normalized_number)。 Oracle還以8位(指數符號+7位)存儲編號的「exponent」分量。最大數目= 2 ^(2^7)* 1.111..111≈3.4 * 10^38 – turbanoff 2012-02-17 21:59:27