2015-01-21 88 views
0

我們試圖將值存儲在具有「Number」數據類型列的表中。問題出現時,我們存儲一個很小的值,如「0.000001。Oracle「Number」數據類型精度

SQL> desc testing 
Name Type Nullable Default Comments 
---- ------ -------- ------- -------- 
A NUMBER Y  

SQL> insert into testing values (0.00000001); 
1 row inserted 

SQL> select * from testing; 
     A 
---------- 
    0.001 
     1E-5 
     1E-8 
    0.0001 

有沒有一種方法,我們可以存儲和檢索的絕對值,如商店,0.00001代替1E-5。

+0

請注意,這只是一個格式問題,而不是精確度損失。數字支持38位有效數字。 – Thilo 2015-01-21 10:20:57

+0

準確存儲值**,它僅適用於此格式的SQL * Plus。使用'to_char()'或更改NLS設置 – 2015-01-21 10:21:03

+0

設置必需的'numformat',請參閱我的答案。 – 2015-01-21 10:35:17

回答

3

這是一個簡單的顯示問題。設置numformat正常。

例如,

SQL> create table t(a number); 

Table created. 

SQL> insert into t values(0.000000000000001); 

1 row created. 

SQL> select * from t; 

     A 
---------- 
1.0000E-15 

SQL> set numformat 9D9999999999999999 
SQL> select * from t; 

        A 
------------------- 
    .0000000000000010 

SQL> 

更新 OP說上面的代碼在嘗試將數值發送到應用程序前端時沒有解決問題。應用程序正在使用的區域設置特定的NLS設置必定有問題。

如果問題出在顯示屏上,那麼可以使用to_char和適當的格式模型將其轉換爲字符。

SQL> create table t(a number); 

Table created. 

SQL> insert into t values(.000000000000000000001); 

1 row created. 

SQL> select * from t; 

     A 
---------- 
1.0000E-21 

SQL> select ltrim(to_char(a, '9999999D999999999999999999999', 'NLS_NUMERIC_CHARACTERS = ''.,''')) num from t 

NUM 
------------------------------ 
.000000000000000000001 

SQL> 

請注意使用ltrim

+0

感謝拉利特, 主要問題是我們在我們的一個程序中以json格式發回這些數據,當我們直接在可以正常工作的promt中使用它時,我們在查詢中執行並以json格式傳遞它,但我們仍然以E-issue爲結束。 – anudeepks 2015-01-21 11:18:56

+0

不,爲什麼要將值作爲「E」發送?問題在於你看到的只是顯示器。 – 2015-01-21 11:22:59

+0

這就是我們也需要理解的同樣的事情,在json發送到.net的前端,他們仍然發現它爲「E」,試圖弄清楚我們是否可以通過任何方式發送它格式正確 – anudeepks 2015-01-21 11:29:22

相關問題