Как намечаются комментарии, вы попадаете в пределы точности чисел Oracle. Другими словами, у Oracle есть предел значительных цифр, которые он может обрабатывать (даже в памяти), прежде чем заставить их выполнить некоторое округление и начать терять точность, что именно то, что вы наблюдали.
Хотя ваш пример делает поведение противоречивым, оно имеет смысл, если мы проиллюстрируем его, увидев, как мы будем переводить эти числа в научную нотацию.
Значок для 10000000000000000000000000000000000000000
, его можно условно представить в следующей форме: 1E+40
.
Однако, чтобы представить число 10000000000000000000000000000000000000001
, на самом деле нет краткого представления. Если я не хочу терять точность, в научной нотации, самый короткий способ представить это 10000000000000000000000000000000000000001E+0
. Но это явно занимает намного больше места, чем просто 1E+40
.
Наоборот, число 90000000000000000000000000000000000000000
может быть представлено кратко так: 9E+40
.
Так что да, это последнее число намного больше, чем предыдущее, но у Oracle нет проблем с его точностью, потому что у него нет значительных цифр.
Здесь используется внутреннее плавание. Легко размножаться, трудно добавить 1. – jarlh
Формат OCINumber может хранить до 38 действительных десятичных цифр (теоретически 40), остальное является показателем степени. Oracle не использует float internaly, но использует BCD-код. См. Http://www.ixora.com.au/notes/number_representation.htm – ibre5041
Спасибо, друзья, я не получил его, я не думаю, что проблема с внутренним хранилищем с момента его вычисления в памяти, как вы думаете? можете ли вы написать хорошо объясненные ответы? – 54l3d