Oracle 中的大数
Large numbers in Oracle
为什么这有效
select 10000000000000000000000000000000000000000*9 from dual --41 digit number
输出:
90000000000000000000000000000000000000000
但这给出了不正确的结果
select 10000000000000000000000000000000000000000+1 from dual --41 digit number
输出:
10000000000000000000000000000000000000000
我不明白为什么 Oracle 可以将一个大数乘以 9 但不能加 1!
正如评论所暗示的那样,您正在达到 Oracle 数字精度的极限。换句话说,在被迫执行一些舍入并开始失去精度之前,Oracle 可以处理(即使在内存中)有效数字的限制,这正是您所观察到的。
虽然您的示例使行为看起来违反直觉,但如果我们通过查看如何将这些数字转换为科学记数法来说明它确实有意义。
所以对于数字10000000000000000000000000000000000000000
,可以用下面的形式简洁地表示:1E+40
.
但是,为了表示数字10000000000000000000000000000000000000001
,确实没有简洁的表示方式。如果我不想失去精度,用科学记数法表示的最短方式是 10000000000000000000000000000000000000001E+0
。但这显然比简单的 1E+40
.
需要更多 space
相比之下,数字90000000000000000000000000000000000000000
可以简明地表示为:9E+40
.
所以是的,最后一个数字比前一个大得多,但 Oracle 可以精确地表示它,因为它没有很多有效数字。
为什么这有效
select 10000000000000000000000000000000000000000*9 from dual --41 digit number
输出:
90000000000000000000000000000000000000000
但这给出了不正确的结果
select 10000000000000000000000000000000000000000+1 from dual --41 digit number
输出:
10000000000000000000000000000000000000000
我不明白为什么 Oracle 可以将一个大数乘以 9 但不能加 1!
正如评论所暗示的那样,您正在达到 Oracle 数字精度的极限。换句话说,在被迫执行一些舍入并开始失去精度之前,Oracle 可以处理(即使在内存中)有效数字的限制,这正是您所观察到的。
虽然您的示例使行为看起来违反直觉,但如果我们通过查看如何将这些数字转换为科学记数法来说明它确实有意义。
所以对于数字10000000000000000000000000000000000000000
,可以用下面的形式简洁地表示:1E+40
.
但是,为了表示数字10000000000000000000000000000000000000001
,确实没有简洁的表示方式。如果我不想失去精度,用科学记数法表示的最短方式是 10000000000000000000000000000000000000001E+0
。但这显然比简单的 1E+40
.
相比之下,数字90000000000000000000000000000000000000000
可以简明地表示为:9E+40
.
所以是的,最后一个数字比前一个大得多,但 Oracle 可以精确地表示它,因为它没有很多有效数字。