Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么Oracle会将一个小于38位有效数字的数字取整?_Oracle - Fatal编程技术网

为什么Oracle会将一个小于38位有效数字的数字取整?

为什么Oracle会将一个小于38位有效数字的数字取整?,oracle,Oracle,我们有Oracle Server 10.2 为了测试这一点,我有一个非常简单的表 CREATE TABLE MYSCHEMA.TESTNUMBER ( TESTNUMBER NUMBER ) 当我尝试插入0.98692326671601283时,数字会向上舍入 INSERT INTO MYSCHEMA.TESTNUMBER (TESTNUMBER) VALUES (0.98692326671601283); 选择返回: select * from TESTNUMBER 0.9869

我们有Oracle Server 10.2

为了测试这一点,我有一个非常简单的表

CREATE TABLE MYSCHEMA.TESTNUMBER
(
  TESTNUMBER  NUMBER
)
当我尝试插入0.98692326671601283时,数字会向上舍入

INSERT INTO MYSCHEMA.TESTNUMBER (TESTNUMBER) 
VALUES (0.98692326671601283);
选择返回:

select * from TESTNUMBER
0.986923266716013

它将最后3个数字“283”四舍五入到“3”

即使用蟾蜍用户界面查看它并尝试用蟾蜍输入它,我也会得到同样的结果。
为什么?是否可以在Oracle数字中插入此数字而不进行取整?

我认为您需要了解客户端程序如何显示数字值。甲骨文数字应以全精度存储该值;但是,该值可以四舍五入以供客户端显示

例如,使用SQLPlus:

dev> create table dctest (x number);

Table created.

dev> insert into dctest VALUES (0.98692326671601283);

1 row created.

dev> select * from dctest;

         X
----------
.986923267

dev> column x format 0.000000000000000000000000000
dev> /

                             X
------------------------------
 0.986923266716012830000000000

如您所见,默认格式仅显示前9位有效数字。但当我明确更改列格式(SQLPlus中的客户端功能)时,会显示插入的完整值。

和带有\u no\u名称的@a\u horse\u这些链接是我感到困惑的原因,我认为数字与浮点数不同。正如您在发送的第一个墨迹中所看到的,“二进制浮点数与数字的不同之处在于Oracle数据库内部存储值的方式。使用十进制精度存储值。”第一个链接状态“使用以下形式指定浮点数:
NUMBER
”,第二个链接状态为“这样的存储方案不能使用十进制精度精确地表示所有值”@a_horse_和_no_name,因此您认为数字会向上舍入,因为它不能用二进制表示?是的,数字在一个字节(00-99)中存储2位数字。它有20个字节。第一个字节有特殊的含义,所以在十进制前后有19*2=38个数字。如果前导或尾随数字为零,则数字可能会大于这个数字:“12345678901346789012345678*10^-62”我想是可能的。目前,我无法使列在TOAD中工作,但只需执行select TO_CHAR(TESTNUMBER)即可来自TESTNUMBER;它工作正常,显示了全部精度。谢谢!