Oracle NUMBER如何使Scale大于Precision?

时间:2010-03-18 21:30:30

标签: oracle precision scale

文档说明:“精度范围为1到38.标度范围为-84到127”。

规模如何大于精度?量表不应该从-38到38?

6 个答案:

答案 0 :(得分:5)

问题可能是为什么不呢? 请尝试以下SQL。

select cast(0.0001 as number(2,5)) num, 
       to_char(cast(0.0001 as number(2,5))) cnum,
       dump(cast(0.0001 as number(2,5))) dmp
  from dual

你看到的是,你可以拿着小数字就是那种结构 它可能不是经常需要的,但我确定在某个地方有人存储非常精确但非常小的数字。

答案 1 :(得分:4)

根据Oracle文档:

  

比例可以大于精度,最常见的是使用ex表示法(其中小数部分可以如此之大)。当scale大于precision时,precision指定小数点右侧的最大有效位数。例如,定义为NUMBER(4,5)的列要求小数点后第一个数字为零,并将所有值舍入小数点后的第五个数字。

以下是我的看法:

  • Precision大于Scale(例如NUMBER(8,5))时,没问题,这很简单。 Precision表示该数字总共有8位数,其中5位于小数部分(。→),因此整数部分(←。)将有3位数。这很容易。
  • 如果您发现Precision小于Scale(例如NUMBER(2, 5)),则表示有三件事:

    • 这个数字不会有任何整数部分,只有小数部分。所以整数部分中的0不计算在计算中,你说.12345不是0.12345。实际上,如果在整数部分中仅指定1位数,它将始终返回错误。
    • Scale表示该数字将包含的小数部分中的总位数。在这种情况下为5。所以它可以是.12345或.00098但总共不超过5位数。
    • 小数部分分为2部分,有效数字和零。重要数字由Precision指定,最小零数等于(Scale - Precision)。示例:

    此处该数字在小数部分中必须至少有3个零。接下来是2个有效数字(也可能为零)。所以3个零+ 2个有效数字= 5,即Scale个数。

简而言之,当你看到例如NUMBER(6,9)时,这告诉我们小数部分总共有9个数字,从强制性的3个零开始,然后是6个数字。

以下是一些例子:

SELECT CAST(.0000123 AS NUMBER(6,9)) FROM dual;   -- prints: 0.0000123; .000|012300
SELECT CAST(.000012345 AS NUMBER(6,9)) FROM dual; -- prints: 0.0000123; .000|012345
SELECT CAST(.123456 AS NUMBER(3,4)) FROM dual;    -- ERROR! must have a 1 zero (4-3=1)
SELECT CAST(.013579 AS NUMBER(3,4)) FROM dual;    -- prints: 0.0136; max 4 digits, .013579 rounded to .0136

答案 2 :(得分:2)

感谢大家的回答。看起来精度是有效位数。

 select cast(0.000123 as number(2,5)) from dual

结果:

.00012

其中

 select cast(0.00123 as number(2,5)) from dual

 select cast(0.000999 as number(2,5)) from dual

两者都导致:

ORA-01438: value larger than specified precision allowed for this column
由于四舍五入,第二个。

答案 3 :(得分:2)

根据Oracle文档:

比例可以大于精度,最常见的是使用e表示法。当scale大于precision时,precision指定小数点右侧的最大有效位数。例如,定义为NUMBER(4,5)的列要求小数点后第一个数字为零,并将所有值舍入小数点后的第五个数字。

优良作法是指定定点数列的比例和精度,以便对输入进行额外的完整性检查。指定比例和精度不会强制所有值都固定长度。如果值超过精度,则Oracle返回错误。如果某个值超过了该比例,那么Oracle会对其进行舍入。

答案 4 :(得分:2)

Scale大于Precision的情况可以用这种方式概括:

小数点右边的位数=比例

十进制右边的最小零数=比例 - 精度

--this will work 
select cast(0.123456 as number(5,5)) from dual;

返回0.12346

-- but this
select cast(0.123456 as number(2,5)) from dual;
--will return "ORA-1438 value too large".  
--It will not return err with at least 5-2 = 3 zeroes:
select cast(0.000123456 as number(2,5)) from dual;

返回0.00012

-- and of course this will work too
select cast(0.0000123456 as number(2,5)) from dual;

返回0.00001

答案 5 :(得分:0)

嗯,据我所知,参考精度是数字的数量 maximum precision of 126 binary digits, which is roughly equivalent to 38 decimal digits

在oracle中,你有NUMBER型(精度,比例),其中精度是总位数,而scale是小数点右边的位数。可以省略比例,但它表示零。精度可以不指定(使用,即NUMBER(*,10)) - 这意味着总数位数是必要的,但有10位数字

如果比例小于零,则该值将四舍五入到小数点后面的scale个数字 我认为如果你保留小数点右边的数字比整数中的数字更多,这意味着像0.00000000123456,但我不是百分百肯定。