文档指出:“精度范围可以从 1 到 38。比例范围可以从 -84 到 127”。
尺度怎么可能大于精度?Scale 的范围不应该是 -38 到 38 吗?
根据 Oracle 文档:
比例可以大于精度,最常见的是使用 ex 表示法(其中小数部分可能很大)。当比例大于精度时,精度指定小数点右侧的最大有效位数。例如,定义为的列
NUMBER(4,5)
要求小数点后的第一位数字为零,并将所有值四舍五入超过小数点后的第五位数字。
这是我的看法:
Precision
大于Scale(例如NUMBER(8,5)
)时,没问题,这很简单。Precision
表示数字共有 8 位,其中 5 位在小数部分 (.→),因此整数部分 (←.) 将有 3 位。这很简单。当您看到Precision
小于Scale
(例如NUMBER(2, 5)
)时,这意味着 3 件事:
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
问题可能是为什么不呢?试试下面的 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
你看到的是你可以保存小数字是那种结构它可能不是经常需要,但我敢肯定在某个地方有人存储非常精确但非常小的数字。
根据 Oracle 文档:
比例可以大于精度,最常见的是使用 e 表示法。当比例大于精度时,精度指定小数点右侧的最大有效位数。例如,定义为 NUMBER(4,5) 的列要求小数点后的第一位数字为零,并将所有值四舍五入超过小数点后的第五位数字。
最好指定定点数列的比例和精度,以便对输入进行额外的完整性检查。指定比例和精度不会强制所有值都为固定长度。如果一个值超过了精度,那么 Oracle 会返回一个错误。如果一个值超过了比例,那么 Oracle 会对其进行四舍五入。
感谢大家的回答。看起来精度是有效位数。
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
由于四舍五入,第二个。
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
嗯,据我了解,参考精度是位数。
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% 确定。