2015-06-03 3 views
3

Почему это работаетБольшие номера в Oracle

select 10000000000000000000000000000000000000000*9 from dual --41 digit number 

Выход:

90000000000000000000000000000000000000000 

, но это дает uncorrect результата

select 10000000000000000000000000000000000000000+1 from dual --41 digit number 

Выход:

10000000000000000000000000000000000000000 

Я не могу понять, почему Oracle может умножить большое число на 9, но не добавить 1 к нему!

+1

Здесь используется внутреннее плавание. Легко размножаться, трудно добавить 1. – jarlh

+1

Формат OCINumber может хранить до 38 действительных десятичных цифр (теоретически 40), остальное является показателем степени. Oracle не использует float internaly, но использует BCD-код. См. Http://www.ixora.com.au/notes/number_representation.htm – ibre5041

+0

Спасибо, друзья, я не получил его, я не думаю, что проблема с внутренним хранилищем с момента его вычисления в памяти, как вы думаете? можете ли вы написать хорошо объясненные ответы? – 54l3d

ответ

2

Как намечаются комментарии, вы попадаете в пределы точности чисел Oracle. Другими словами, у Oracle есть предел значительных цифр, которые он может обрабатывать (даже в памяти), прежде чем заставить их выполнить некоторое округление и начать терять точность, что именно то, что вы наблюдали.

Хотя ваш пример делает поведение противоречивым, оно имеет смысл, если мы проиллюстрируем его, увидев, как мы будем переводить эти числа в научную нотацию.

Значок для 10000000000000000000000000000000000000000, его можно условно представить в следующей форме: 1E+40.

Однако, чтобы представить число 10000000000000000000000000000000000000001, на самом деле нет краткого представления. Если я не хочу терять точность, в научной нотации, самый короткий способ представить это 10000000000000000000000000000000000000001E+0. Но это явно занимает намного больше места, чем просто 1E+40.

Наоборот, число 90000000000000000000000000000000000000000может быть представлено кратко так: 9E+40.

Так что да, это последнее число намного больше, чем предыдущее, но у Oracle нет проблем с его точностью, потому что у него нет значительных цифр.

+0

Ницца. Документы находятся здесь: http://docs.oracle.com/cd/B28359_01/server.111/b28318/datatype.htm#CNCPT1832 –

Смежные вопросы