2016-05-24 126 views
0

我不确定什么是我可以存储在oracle数据库中的以下列类型的最大和最小正值:FLOAT,BINARY_FLOAT和BINARY_DOUBLE。Oracle数据库浮点类型限制

我在oracle参考文档中找不到这些信息。有谁能够帮助我?

+2

嗯,这很容易找到 - https://docs.oracle.com/database/121/SQLRF/sql_elements001.htm#SQLRF30020 – OldProgrammer

+1

最小正面还是负面的? – mik

回答

-1

根据另一篇文章: “尽管甲骨文可以存储数字,大(小),则最多只有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

+0

[有时可以有40个重要的(十进制)数字](http://stackoverflow.com/a/34595675/266304)。其中提到[在文档](http://docs.oracle.com/cd/E11882_01/server.112/e41084/sql_elements001.htm#sthref118)。 –

+0

指数正常,它们帮助将更大的数字存储在浮点数据类型中。 – mik

1

我已经使用了以下脚本测试最大值三个数据类型:

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 
+0

它似乎是一个可接受的答案...我会检查出来... – cangosta