6

文档指出:“精度范围可以从 1 到 38。比例范围可以从 -84 到 127”。

尺度怎么可能大于精度?Scale 的范围不应该是 -38 到 38 吗?

4

6 回答 6

6

根据 Oracle 文档:

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

这是我的看法:

  • Precision大于Scale(例如NUMBER(8,5))时,没问题,这很简单。Precision表示数字共有 8 位,其中 5 位在小数部分 (.→),因此整数部分 (←.) 将有 3 位。这很简单。
  • 当您看到Precision小于Scale(例如NUMBER(2, 5))时,这意味着 3 件事:

    • 该数字没有任何整数部分,只有小数部分。所以整数部分的 0 不计入计算中,你说的是 0.12345 而不是 0.12345。事实上,如果你只在整数部分指定 1 位,它总是会返回错误。
    • 表示数字将具有的小数部分中的Scale总位数。5 在这种情况下。所以它可以是 .12345 或 .00098,但总共不超过 5 位。
    • 小数部分分为两部分,有效数字和零。有效数字由 指定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
于 2017-08-18T20:25:10.773 回答
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

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

于 2010-03-18T22:10:30.983 回答
2

根据 Oracle 文档:

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

最好指定定点数列的比例和精度,以便对输入进行额外的完整性检查。指定比例和精度不会强制所有值都为固定长度。如果一个值超过了精度,那么 Oracle 会返回一个错误。如果一个值超过了比例,那么 Oracle 会对其进行四舍五入。

于 2011-06-28T18:31:39.247 回答
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

由于四舍五入,第二个。

于 2010-03-20T13:10:17.447 回答
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

于 2016-06-06T16:50:47.700 回答
0

嗯,据我了解,参考精度是位数。
maximum precision of 126 binary digits, which is roughly equivalent to 38 decimal digits

在 oracle 中,您有类型 NUMBER(precision,scale),其中精度是总位数,比例是小数点右边的位数。刻度可以省略,但它意味着零。可以未指定精度(使用 NUMBER(*,10)) - 这意味着需要的总位数,但有 10 位正确

如果比例小于零,则该值将四舍五入到scale小数点左侧的数字。
我认为,如果您保留的小数点右边的数字比整数中的数字多,这意味着像 0.00000000123456 但我不是 100% 确定。

于 2010-03-18T21:38:00.353 回答