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

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

Вычитание [D5, Paradox]


DDDD ©   (2002-09-20 15:39:00) 

Здрасте!
Есть такое выражение
dm.TblSpisKartMaterKol_Pol.AsFloat:=dm.TblSpisKartMaterKol_Pol.AsFloat-dm.TblTempAktKol1.AsFloat;
Где две таблицы Парадокс и поля типа NUMBER.
Когда результатом вычитания должен быть 0 получается 4,56-Е15 или там другое число в огромной степени.
В чем дело помогите!
сПАСИБО.


Виталий Панасенко   (2002-09-23 09:16:00) [1]

Побробуй BCD ENABLE=True в алиасе


MsGuns   (2002-09-21 21:57:00) [2]

В таблицах типа Paradox при использовании чисел типа Float в вычислениях неизбежно появление т.н. "хвостов", т.е. когда 23-23 не равно 0 (а равно -0.00000000008765 или +0.00000...).
Практически это выглядит так: остаток на складской карточке=0, а сумма что-то типа приведенного ниже, в рез-те при выдаче отчета о нулевых позициях, такие карточки туда не попадают.
Можно, конечно, на это наплевать, ибо на кон.балансе по складу такие "молекулы" не сказываются, однако не всем клиентам нравится такие "хвосты". Поэтому есть 2 выхода из такой ситуации:
1. Заменить Float на BCD (но там есть несколько подводных камней)
2. Использовать округления после каждого вычисления.

Других эффективных средств, насколько я знаю, нет.


Мышь   (2002-09-21 21:29:00) [3]

Замечу, что X := Round(X*100) / 100 не гарантирует отсутствия потери точности в типах с плавающей точкой. Есть спец. функция, которая округляет float-число до заданной точности. Сказал бы, но хоть убей, не помню, как ее зовут. Что-то типа *Int*. Короче, извините. Однако и эта функция может вернуть некорректный результат, так как потеря точности связана с методом хранения таких чисел. Например, после X := 0, можно увидеть в X что нибудь типа 0.000001. Я видел такой глюк в 6-ом знаке, хотя это и нонсенс.


DDDD   (2002-09-20 16:57:00) [4]

Спасибо всем если нечего больше сказать!


Johnmen   (2002-09-20 16:50:00) [5]

Применяй округление к конечному рез-ту (так побыстрее)...


DDDD   (2002-09-20 16:45:00) [6]

round не пойдет :
Во первых обрабатывается очень много записей и это и так не быстро.
Во вторых то я все таки не понял к чему round к ответу или к слогаемым!!! Если к слогаемым так числа целые ну максимум три знака после запятой.


Johnmen   (2002-09-20 16:38:00) [7]

Если поля целочисленные, то AsInteger и проблем не будет,
если нет и AsFloat - то см. выше, в т.ч. Peter Gluhiy © (20.09.02 15:48)


DDDD   (2002-09-20 16:37:00) [8]

>>Johnmen
Перед вычитанием - округлять до потребной точности...:)))

Что округлять я что то не понял.
Я пробовал приводить их к другим !!! типам данных все равно!!!


Peter Gluhiy   (2002-09-20 16:36:00) [9]

Ну что ты не можеш round написать!!!


DDDD   (2002-09-20 16:32:00) [10]

>>Johnmen
Перед вычитанием - округлять до потребной точности...:)))

Что округлять я что то не понял.
Я пробовал приводить их к другим !!! типам данных все равно!!!


Johnmen   (2002-09-20 16:24:00) [11]

Перед вычитанием - округлять до потребной точности...:)))


DDDD   (2002-09-20 16:18:00) [12]

Ну и че делать скажите пожалуйста!!!


Johnmen   (2002-09-20 16:16:00) [13]

Погрешности разрядной сетки, однако... :o)))


DDDD   (2002-09-20 16:15:00) [14]

Да дело в том что должен получится 0.
К примеру 23-23 должен 0 а получается 4,245678456-Е15


Peter Gluhiy   (2002-09-20 16:06:00) [15]

Та не страшно это :-)
Округление до двух знаков после запятой.


DDDD   (2002-09-20 16:01:00) [16]

А можно узнать почему и зачем! Если конечно не тяжело, а то выглядет это как то странно и страшно!


DDDD   (2002-09-20 15:56:00) [17]

А можно узнать почему и зачем. Если конечно не тяжело!


Peter Gluhiy   (2002-09-20 15:48:00) [18]

dm.TblSpisKartMaterKol_Pol.AsFloat:=round((dm.TblSpisKartMaterKol_Pol.AsFloat-dm.TblTempAktKol1.AsFloat)*100)/100;


Наверх

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