Форум: "Базы";
Текущий архив: 2002.10.14;
Скачать: [xml.tar.bz2];
ВнизВычитание Найти похожие ветки
← →
DDDD (2002-09-20 15:39) [0]Здрасте!
Есть такое выражение
dm.TblSpisKartMaterKol_Pol.AsFloat:=dm.TblSpisKartMaterKol_Pol.AsFloat-dm.TblTempAktKol1.AsFloat;
Где две таблицы Парадокс и поля типа NUMBER.
Когда результатом вычитания должен быть 0 получается 4,56-Е15 или там другое число в огромной степени.
В чем дело помогите!
сПАСИБО.
← →
Peter Gluhiy (2002-09-20 15:48) [1]dm.TblSpisKartMaterKol_Pol.AsFloat:=round((dm.TblSpisKartMaterKol_Pol.AsFloat-dm.TblTempAktKol1.AsFloat)*100)/100;
← →
DDDD (2002-09-20 15:56) [2]А можно узнать почему и зачем. Если конечно не тяжело!
← →
DDDD (2002-09-20 16:01) [3]А можно узнать почему и зачем! Если конечно не тяжело, а то выглядет это как то странно и страшно!
← →
Peter Gluhiy (2002-09-20 16:06) [4]Та не страшно это :-)
Округление до двух знаков после запятой.
← →
DDDD (2002-09-20 16:15) [5]Да дело в том что должен получится 0.
К примеру 23-23 должен 0 а получается 4,245678456-Е15
← →
Johnmen (2002-09-20 16:16) [6]Погрешности разрядной сетки, однако... :o)))
← →
DDDD (2002-09-20 16:18) [7]Ну и че делать скажите пожалуйста!!!
← →
Johnmen (2002-09-20 16:24) [8]Перед вычитанием - округлять до потребной точности...:)))
← →
DDDD (2002-09-20 16:32) [9]>>Johnmen
Перед вычитанием - округлять до потребной точности...:)))
Что округлять я что то не понял.
Я пробовал приводить их к другим !!! типам данных все равно!!!
← →
Peter Gluhiy (2002-09-20 16:36) [10]Ну что ты не можеш round написать!!!
← →
DDDD (2002-09-20 16:37) [11]>>Johnmen
Перед вычитанием - округлять до потребной точности...:)))
Что округлять я что то не понял.
Я пробовал приводить их к другим !!! типам данных все равно!!!
← →
Johnmen (2002-09-20 16:38) [12]Если поля целочисленные, то AsInteger и проблем не будет,
если нет и AsFloat - то см. выше, в т.ч. Peter Gluhiy © (20.09.02 15:48)
← →
DDDD (2002-09-20 16:45) [13]round не пойдет :
Во первых обрабатывается очень много записей и это и так не быстро.
Во вторых то я все таки не понял к чему round к ответу или к слогаемым!!! Если к слогаемым так числа целые ну максимум три знака после запятой.
← →
Johnmen (2002-09-20 16:50) [14]Применяй округление к конечному рез-ту (так побыстрее)...
← →
DDDD (2002-09-20 16:57) [15]Спасибо всем если нечего больше сказать!
← →
Мышь (2002-09-21 21:29) [16]Замечу, что X := Round(X*100) / 100 не гарантирует отсутствия потери точности в типах с плавающей точкой. Есть спец. функция, которая округляет float-число до заданной точности. Сказал бы, но хоть убей, не помню, как ее зовут. Что-то типа *Int*. Короче, извините. Однако и эта функция может вернуть некорректный результат, так как потеря точности связана с методом хранения таких чисел. Например, после X := 0, можно увидеть в X что нибудь типа 0.000001. Я видел такой глюк в 6-ом знаке, хотя это и нонсенс.
← →
MsGuns (2002-09-21 21:57) [17]В таблицах типа Paradox при использовании чисел типа Float в вычислениях неизбежно появление т.н. "хвостов", т.е. когда 23-23 не равно 0 (а равно -0.00000000008765 или +0.00000...).
Практически это выглядит так: остаток на складской карточке=0, а сумма что-то типа приведенного ниже, в рез-те при выдаче отчета о нулевых позициях, такие карточки туда не попадают.
Можно, конечно, на это наплевать, ибо на кон.балансе по складу такие "молекулы" не сказываются, однако не всем клиентам нравится такие "хвосты". Поэтому есть 2 выхода из такой ситуации:
1. Заменить Float на BCD (но там есть несколько подводных камней)
2. Использовать округления после каждого вычисления.
Других эффективных средств, насколько я знаю, нет.
← →
Виталий Панасенко (2002-09-23 09:16) [18]Побробуй BCD ENABLE=True в алиасе
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2002.10.14;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.007 c