文档说明:“精度范围为1到38.标度范围为-84到127”。
规模如何大于精度?量表不应该从-38到38?
答案 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)
),则表示有三件事:
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
答案 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,但我不是百分百肯定。