Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Неправильное хранение переменной и округление в oracle  [new]
flawy
Member

Откуда:
Сообщений: 8
В проекте, который сопровождаю, второй раз столкнулся с проблемой. Первый раз обошел, но второй раз игнорировать уже не смог) Решения не нашел, поэтому создал тему (вообще первая тема за 2 года работы программистом БД).
22 мар 13, 15:08    [14082896]     Ответить | Цитировать Сообщить модератору
 Re: Неправильное хранение переменной и округление в oracle  [new]
Артем П.
Member

Откуда: Рязань
Сообщений: 49
flawy,

описание проблемы с примером кода, без этого никто не напишет и ничего не скажет :)
22 мар 13, 15:12    [14082925]     Ответить | Цитировать Сообщить модератору
 Re: Неправильное хранение переменной и округление в oracle  [new]
flawy
Member

Откуда:
Сообщений: 8
Суть в том что функция round округляет до целого в меньшую сторону переменную number(без заданной точности). Причем только числа вида xxx5.5 или xxx0.5. Должно округлять пятерку до большего и отдельно если округлять запросом какое то такое число то все норм. Но это число в системе результат работы функции. Поэтому грешу на хранение переменной. Был интересный опыт. Результат функции округлял до 1 знака, а затем сразу до целого - и все округлялось правильно
22 мар 13, 15:14    [14082944]     Ответить | Цитировать Сообщить модератору
 Re: Неправильное хранение переменной и округление в oracle  [new]
Достали
Guest
имеющий изъяны,

Поток сознания закончился?
Факты будут?
Или флудер?
22 мар 13, 15:14    [14082945]     Ответить | Цитировать Сообщить модератору
 Re: Неправильное хранение переменной и округление в oracle  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15487
flawy,

Как правильно задавать вопросы
22 мар 13, 15:14    [14082947]     Ответить | Цитировать Сообщить модератору
 Re: Неправильное хранение переменной и округление в oracle  [new]
flawy
Member

Откуда:
Сообщений: 8
Достали, не. клацнул при создании темы на энтер а тему отредактировать нельзя O_o
22 мар 13, 15:15    [14082961]     Ответить | Цитировать Сообщить модератору
 Re: Неправильное хранение переменной и округление в oracle  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15487
flawy,

1) для того, чтобы посмотреть что именно у вас в базе лежит используйте
select dump(..) 

2) попробуйте тестик представить, повторяемый в sqlplus
3) версию сервера не ленитесь указывать
22 мар 13, 15:29    [14083057]     Ответить | Цитировать Сообщить модератору
 Re: Неправильное хранение переменной и округление в oracle  [new]
flawy
Member

Откуда:
Сообщений: 8
Спс за ответ. oracle 11.2. Функция для получения этого округляемого затем значения берет много данных из таблиц, все поля типа number. Формула непростая, но если в данном тестовом примере, который вызывает проблемы, руками все считать, получается именно число с одним знаком после запятой. Это число не из базы, оно считается и хранится в локальной переменной типа number
22 мар 13, 15:42    [14083161]     Ответить | Цитировать Сообщить модератору
 Re: Неправильное хранение переменной и округление в oracle  [new]
flawy
Member

Откуда:
Сообщений: 8
dump попробую
22 мар 13, 15:44    [14083190]     Ответить | Цитировать Сообщить модератору
 Re: Неправильное хранение переменной и округление в oracle  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15487
flawy,

воспроизвести вашу беду достаточно просто.
with t as (select (1/3)*3-0.5 n from dual)
select n
      ,to_char(n)
      ,to_char(n,rpad('d',41,9))
      ,dump(n)
      ,round(n)
      ,trunc(n)
      ,round(round(n,1))
      ,trunc(round(n,1))
  from t;

то есть - никаких чудес, а чистая правда. оракл хранит в точности то, что вы ему даёте, ну а то, что даёте ему числа с слабо различимым
десятичным хвостом - это ваша проблема.
собственно, достаточно домен (десятичную точность) для колонки в таблице задать.
либо использовать округление, ликвидирующее погрешность вычислений, перед вставкой данных в таблицу
22 мар 13, 15:46    [14083200]     Ответить | Цитировать Сообщить модератору
 Re: Неправильное хранение переменной и округление в oracle  [new]
flawy
Member

Откуда:
Сообщений: 8
да както так и представлял но верить не хотелось. просто выводит же 0.5, получается значит, знает что может быть погрешность и выводит округленно, а при использовании round() уже фактическое значение берет. Как-то нехорошо. Но ладно спасибо. А что значит использовать округление, ликвидирующее погрешность вычислений?
22 мар 13, 15:52    [14083239]     Ответить | Цитировать Сообщить модератору
 Re: Неправильное хранение переменной и округление в oracle  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15487
flawy
да както так и представлял но верить не хотелось. просто выводит же 0.5, получается значит, знает что может быть погрешность и выводит округленно, а при использовании round() уже фактическое значение берет. Как-то нехорошо. Но ладно спасибо. А что значит использовать округление, ликвидирующее погрешность вычислений?

видно же, что выводит 0.5 только тогда, когда формат соответствующий.
если каков тот формат вы сами не следите, то и не обижайтесь на результат работы формата-по-умолчанию клиента вашего.

flawy
.. А что значит использовать округление, ликвидирующее погрешность вычислений?

дыкть, в этом примере
.4999999999999999999999999999999999999999

40 знаков после запятой. округлите до десятого (или третьего/пятого) - правильно это будет во всех смыслах
(базе - хранить меньше байтов, ну а вам - не налетать на грабли)
22 мар 13, 16:09    [14083385]     Ответить | Цитировать Сообщить модератору
 Re: Неправильное хранение переменной и округление в oracle  [new]
flawy
Member

Откуда:
Сообщений: 8
спасиб большое добрчеловек! век живи век учись
22 мар 13, 16:12    [14083406]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить