我不确定什么是我可以存储在oracle数据库中的以下列类型的最大和最小正值:FLOAT,BINARY_FLOAT和BINARY_DOUBLE。Oracle数据库浮点类型限制
我在oracle参考文档中找不到这些信息。有谁能够帮助我?
我不确定什么是我可以存储在oracle数据库中的以下列类型的最大和最小正值:FLOAT,BINARY_FLOAT和BINARY_DOUBLE。Oracle数据库浮点类型限制
我在oracle参考文档中找不到这些信息。有谁能够帮助我?
根据另一篇文章: “尽管甲骨文可以存储数字,大(小),则最多只有38个显著数字存储所以,可以存储在多个字段中的最大值为:
9,999,999,999,999,999,999,999,999,999,999,999,999,999
这是我能摆在那里的最大数量,之后指数接手。” 从https://www.experts-exchange.com/questions/27958682/maximum-value-that-can-be-handled-by-oracle-datatype-number.html
[有时可以有40个重要的(十进制)数字](http://stackoverflow.com/a/34595675/266304)。其中提到[在文档](http://docs.oracle.com/cd/E11882_01/server.112/e41084/sql_elements001.htm#sthref118)。 –
指数正常,它们帮助将更大的数字存储在浮点数据类型中。 – mik
我已经使用了以下脚本测试最大值三个数据类型:
declare
x float := 0;
xx float := 1;
y binary_float := 0;
yy binary_float := 1;
z binary_double := 0;
zz binary_double := 1;
begin
<<outx>> loop loop if x+xx = x then exit outx; end if; if x+xx is not infinite then x:=x+xx; xx:=xx*2; else exit; end if; end loop; xx:=xx/2; end loop;
<<outy>> loop loop if y+yy = y then exit outy; end if; if y+yy is not infinite then y:=y+yy; yy:=yy*2; else exit; end if; end loop; yy:=yy/2; end loop;
<<outz>> loop loop if z+zz = z then exit outz; end if; if z+zz is not infinite then z:=z+zz; zz:=zz*2; else exit; end if; end loop; zz:=zz/2; end loop;
dbms_output.put_line('float='||x);
dbms_output.put_line('binary_float='||y);
dbms_output.put_line('binary_double='||z);
end;
/
,结果是:
float=9.999999999999999999999999999999999999999000000000000000000000000000000000000000000000000000000E+125
binary_float=3.40282347E+038
binary_double=1.7976931348623157E+308
要测试的最小正值我已经使用:
declare
x float := 1;
xx float := .5;
y binary_float := 1;
yy binary_float := .5;
z binary_double := 1;
zz binary_double := .5;
begin
<<outx>> loop loop if 1-xx > 0 and x*(1-xx) = x then exit outx; end if; if 1-xx > 0 and x*(1-xx) > 0 then x:=x*(1-xx); xx:=xx*2; else exit; end if; end loop; xx:=xx/2; end loop;
<<outy>> loop loop if 1-yy > 0 and y*(1-yy) = y then exit outy; end if; if 1-yy > 0 and y*(1-yy) > 0 then y:=y*(1-yy); yy:=yy*2; else exit; end if; end loop; yy:=yy/2; end loop;
<<outz>> loop loop if 1-zz > 0 and z*(1-zz) = z then exit outz; end if; if 1-zz > 0 and z*(1-zz) > 0 then z:=z*(1-zz); zz:=zz*2; else exit; end if; end loop; zz:=zz/2; end loop;
dbms_output.put_line('float='||x);
dbms_output.put_line('binary_float='||y);
dbms_output.put_line('binary_double='||z);
end;
/
并且结果是:
float=1.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000E-130
binary_float=1.40129846E-045
binary_double=4.9406564584124654E-324
它似乎是一个可接受的答案...我会检查出来... – cangosta
嗯,这很容易找到 - https://docs.oracle.com/database/121/SQLRF/sql_elements001.htm#SQLRF30020 – OldProgrammer
最小正面还是负面的? – mik