Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Почему IBase не делает того что нужно??? [D5, IB5.x]


Sirus ©   (2002-10-16 10:13:00) 

Привет Мастера... Есть недоумение такое...
У меня есть SQL команда:
insert into SUBS_PAY
(PAY_SUMM, PAY_NDS)
values (123.12, 234.23)

Вроде все идет хорошо, команда выполняется 96 раз
естественно с различными values...
Но вот когда команда выполняется в 97 раз в таблицу записываются не совсем правильные данные... т.е. вместо числа 654.65 записывается 654.6499999999.... Тип поля NUMERIC(15,2)
длина неправильного числа вместе с точкой 15 символов...
Почему так происходит??? И как лечить???


Sirus   (2002-10-16 12:04:00) [1]

> Johnmen © (16.10.02 12:01)
> Ок !
> Кстати...Один из стандартных выходов - хранить в integer,
> а в приложении интерпретировать с нужной точностью...

Вот именно... Так я и сделал... Надеюсь теперь такого не повторится.... :)))


Johnmen   (2002-10-16 12:01:00) [2]

>Sergey13 © (16.10.02 11:48)

Ок !
Кстати...Один из стандартных выходов - хранить в integer,
а в приложении интерпретировать с нужной точностью...


Alexandr   (2002-10-16 11:57:00) [3]

1) Использовать 3 диалект
2) Или использовать первый диалект, но с Integer или DoublePrecision


Sirus   (2002-10-16 11:51:00) [4]

Как я уже сказал в самом начале: тип поля NUMERIC(15,2)
Может есть другой способ....


Sergey13   (2002-10-16 11:48:00) [5]

2Johnmen © (16.10.02 11:32)
>Нет ! Там будет стоять не 0 ! Просто тебе показывается значение уже с округлением...
Так в том то и трабла, что показывает не то что есть. Да и черт с ним с показом. Плохо то что условие не работает из-за этого.

Предлагаю сойтись на компромисе - хранит хорошо, но не точно. 8-)


Johnmen   (2002-10-16 11:32:00) [6]

>Sergey13 © (16.10.02 11:26)
>...Причем в значении этого поля гордо стоит 0,...

Нет ! Там будет стоять не 0 ! Просто тебе показывается значение уже с округлением...

>...Другого способа я не придумал...

Я тоже.. :-)


Sergey13   (2002-10-16 11:26:00) [7]

2Johnmen © (16.10.02 11:06)
>Зато скорость работы с полями а-ля float максимально высока !
Типа приехали не туда, зато быстро. 8-)
>А клиент пусть сам думает, как это понимать. :-)
Клиент всегда прав. 8-) Если в поле есть значение 12,34 и я вычитаю 12,34, а затем запрашиваю все записи с НЕ НУЛЕВЫМ значением, то какого черта ИНОГДА (я подчеркиваю ИНОГДА) вылезает эта запись. Причем в значении этого поля гордо стоит 0, и понять причину этого появления можно только если запросить это поле умноженым на дофига. И лечится это только принудительным округлением до точности указанной в типе поля (например NUMERIC(15,2)). Другого способа я не придумал. Может подскажешь.

2Sirus © (16.10.02 11:10)
А по моему ты не понял ответов.


Sirus   (2002-10-16 11:21:00) [8]

В общем если я правильно понял, то
на select SUM(FIELD) from TABLE не стоит надеятся...
Нужно вручную все суммировать и округлять...
Так???
Ну чтож... спасибо на этом... :))


Johnmen   (2002-10-16 11:15:00) [9]

>Sirus © (16.10.02 11:10)

По-моему, ты не понял ответа...:o))


Sirus   (2002-10-16 11:10:00) [10]

По моему никто не понял вопроса...
Почему в результате команды:
insert into SUBS_PAY
(PAY_SUMM, PAY_NDS)
values (654.65, 321.32)

Получаем в базе значения
PAY_SUMM=654.65
PAY_NDS=321.3199999999
????


Johnmen   (2002-10-16 11:06:00) [11]

>Sergey13 © (16.10.02 11:01)

Отдает, как хранит...:)))
А клиент пусть сам думает, как это понимать. :-)
Зато скорость работы с полями а-ля float максимально высока !


Sergey13   (2002-10-16 11:01:00) [12]

2Johnmen © (16.10.02 10:47)
>Хранит абсолютно нормально !
Только клиенту отдает хреново 8-)

То-то каждую неделю этот вопрос поднимается и именно по ИБ. А вот по другим базам я что то не встречал подобных вопросов. И сам с такими траблами не сталкивался. Только на ИБ.


Johnmen   (2002-10-16 10:47:00) [13]

>Sergey13 © (16.10.02 10:37)
>Не умеет ИБ нормально числа хранить

Хранит абсолютно нормально !


Sergey13   (2002-10-16 10:37:00) [14]

Писать свою (или использовать готовую) UDF на округление и вставлять ее в тригеры. Не умеет ИБ нормально числа хранить.


Johnmen   (2002-10-16 10:35:00) [15]

Регулярный вопрос ! :)))
Регулярный ответ - погрешность разрядной сетки....


Наверх

Титульная страница Поиск, карта сайта Написать письмо