2015-01-21 61 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

相关问题