为什么会这样?
select 10000000000000000000000000000000000000000*9 from dual --41 digit number
输出:
90000000000000000000000000000000000000000
但这会给出不正确的结果
select 10000000000000000000000000000000000000000+1 from dual --41 digit number
输出:
10000000000000000000000000000000000000000
我无法理解为什么Oracle可以将大数乘以9但却无法将其加1!
答案 0 :(得分:2)
正如评论所暗示的那样,您正在达到Oracle数字精度的极限。换句话说,Oracle在被迫执行某些舍入并开始失去精度之前,可以处理有效数字的限制(即使在内存中),这正是您所观察到的。
虽然你的例子使得这种行为看起来与反直觉有关,但如果我们通过看看如何将这些数字转换成科学记数法来说明它是有意义的。
因此,对于数字10000000000000000000000000000000000000000
,可以通过以下格式简洁地表示:1E+40
。
但是,为了表示数字10000000000000000000000000000000000000001
,实际上没有简洁的方法来表示它。如果我不想丢失精确度,用科学记数法表示,10000000000000000000000000000000000000001E+0
表示最短的方式。但这显然需要比简单1E+40
更多的空间。
相比之下,数字90000000000000000000000000000000000000000
可以简洁地表示为:9E+40
。
所以是的,最后一个数字比前一个数字要大得多,但是Oracle没有问题,因为它没有很多有效数字,所以没有任何问题,因为它没有很多有效数字。