在Oracle NUMBER上产生的操作精度

时间:2017-08-02 17:39:43

标签: oracle precision arbitrary-precision

操作员在2个Oracle默认/给定NUMBER列上的值的精确度是多少(其中NUMBER没有设置(p,s)))?就像我:

create table foo(field1 NUMBER, field2 NUMBER);

insert into foo (field1, field2) values (1.1, 3);

select field1/field2 as f1df2 from foo;

f1df2为0.3666666666666 ... 7?

1 个答案:

答案 0 :(得分:0)

  

f1df2为0.3666666666666 ... 7?

在未设置NUMBER的情况下创建的p,s列中插入的数字已存储'as given'。在这些列上产生的操作精度似乎是最高精度和比例列的精度和比例:

create table test_number(f1 number, f2 number, f3 integer);
-- remember integer in Oracle is NUMBER(38)

insert into test_number (f1, f2, f3) values (1.1, 3, 4);

select f1/f2 as f1df2, f2/f3 as f2df3 from test_number

结果:

F1DF2                                     |F2DF3
------------------------------------------|-----
0.3666666666666666666666666666666666666667|0.75

请注意,即使将f1重新定义为NUMBER(p, 1),也是如此!似乎为(p,s)定义NUMBER字段仅限制输入到字段中的数据的精度。

现在,如果我们将任意精度类型与float混合会发生什么?好吧,根据Oracle Numeric Precedence规则:

  
      
  • 如果任何操作数是BINARY_DOUBLE,则Oracle会在执行操作之前尝试将所有操作数隐式转换为BINARY_DOUBLE。

  •   
  • 如果没有操作数是BINARY_DOUBLE但任何操作数都是BINARY_FLOAT,那么Oracle会在执行操作之前尝试将所有操作数隐式转换为BINARY_FLOAT。

  •   
  • 否则,Oracle会在执行操作之前尝试将所有操作数转换为NUMBER

  •