![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Вычитание [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;