2010-03-18 169 views

回答

4

这个问题可能是为什么不是? 请尝试以下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 

你看到的是,你可以举办小型的数字是那种结构的 它可能不是很经常需要,但我敢肯定的地方是谁的人是存储非常精确,但非常小的数字。

+0

@加里,谢谢你的例子。文档中说精度是总位数,标度是小数点后的数字。那么NUMBER(2,5)如何将“总位数”设为2,并在小数点后面存储5位数? – aiGuru 2010-03-18 22:22:15

+2

我认为是这样的: NUMBER(2,5)例如0.00012 = 1.2E-4 或类似的东西 – Tobias 2010-03-19 07:19:12

0

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

在oracle中你有类型NUMBER(精度,小数)其中精度的数字和刻度总数的小数点数字的正确数量。比例可以省略,但它意味着零。精度可以不指定(使用即NUMBER(*,10)) - 这意味着总数位数是按需要的,但有10位数字正确

如果比例小于零,则数值将四舍五入为scale数字离开小数点。
我认为,如果你保留更多的小数点右边的数字比整个数字中可以有更多的数字,这意味着类似于0.0000000,但我不是100%确定。

+0

托拜厄斯:如果规模比精度较大(例如'NUMBER(1,2)'),那么我们得到'ORA-06502:PL/SQL:数字或值错误字符串'当试图**分配**一个值给它 - 而不是当**定义**它... – 2010-03-18 21:59:55

2

感谢大家的答案。它看起来像精度是有效数字的数量。

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

结果:

.00012 

select cast(0.0as 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 

由于四舍五入的第二个。

2

根据Oracle文档:

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

指定定点编号列的比例和精度以便对输入进行额外的完整性检查是一种很好的做法。指定比例和精度不会将所有值强制为固定长度。如果一个值超过精度,则Oracle返回一个错误。如果一个值超过了规模,那么Oracle会对其进行调整。

2

其中规模大于精度可以概括这样的情况:

对小数点右边位数=规模

零权小数=秤的最小数量 - 精密

--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.00as number(2,5)) from dual; 

返回0.00012

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

返回0.00001

1

根据Oracle文档:

规模可以大于精度,最常用当使用前符号(其中小数部分可以是如此之大) 。当比例大于精度时,精度将指定小数点右侧的最大有效位数。例如,定义为NUMBER(4,5)的列要求小数点后第一位的值为零,并将小数点后第五位后的所有值四舍五入。

我是这样看的:

  • Precision比规模更大(如),没问题,这很简单。 Precision表示该数字共有8位数字,其中5个位于小数部分(。→),因此整数部分(←。)将有3位数字。这很容易。
  • 当你看到Precision小于Scale(例如NUMBER(2, 5)),这意味着3两件事:

    • 的数量不会有任何的整数部分,只有小数部分。所以整数部分的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(.000AS NUMBER(6,9)) FROM dual; -- prints: 0.0000123; .000|
SELECT CAST(.000AS NUMBER(6,9)) FROM dual; -- prints: 0.0000123; .000|
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 
相关问题