:: Visual Foxpro, Foxpro for DOS
Оператор %, глюк
of63
Автор

Сообщений: 25161
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
Детектировал суммы с дробными копейками оператором % 0.01, и выяснилось:
* вот два одинаковых исходных числа:
? 000.80 % 0.01 && 0.00
? 942.80 % 0.01 && 0.00
* вот для этого оператора EMPTY я и делил:
? EMPTY(000.80 % 0.01) && .T.
? EMPTY(942.80 % 0.01) && .F. это неправильно!
* что же внутри фокса получается в результате деления?
? STR(000.80 % 0.01, 15, 13) && 0.0000000000000
? STR(942.80 % 0.01, 15, 13) && -.0000000000001
...И в тоже время при умножении делимого и делителя на 100 получается правильно:
? EMPTY((000.80 * 100) % 1) && .T.
? EMPTY((942.80 * 100) % 1) && .T.

В фокс встроен какой-то ИИ по автоматическому округлению там, "где надо", но что-то тут не сработало... или делить можно только на целые числа...

Доб. Оказалось, проблема в ф-ии EMPTY. Она не обладает ИИ по округлению:
? EMPTY(942.80 % 0.01) && .F. это неправильно!
? 0 = (942.80 % 0.01) && .T. это правильно!



Исправлено 1 раз(а). Последнее : of63, 14.09.17 17:53
Ratings: 0 negative/0 positive
Re: Оператор %, глюк
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
of63
В фокс встроен какой-то ИИ по автоматическому округлению там, "где надо"
Да. Т.к. 90% начинающих программистов (вообще, ну и 90% любых программистов на фоксе - даже с 10+ летним стажем) не понимают логику работы машинной арифметики для "вещественных" типов данных. В частности особенности операций "точного сравнения" машинного числа с десятичной константой в коде.
of63
но что-то тут не сработало... или делить можно только на целые числа...
Не имеет значения на что делить/умножать или как брать остаток. Имеет значение то, что вещественные числа в машинном представлении очень часто НЕ совпадают с той десятичной записью, при помощи которой они инициализированы (запись литерала в коде программы, к примеру).
Твой пример как раз из этой области. Запись в коде 942.80 превращается в машинное число НЕ являющееся точным десятичным значением 942.80
P.S. Не очень понимаю для чего нужны "дробные копейки", но в общем для работы с деньгами следует применять либо обычные целые числа (увы, это не возможно в фоксе, т.к. ты не можешь управлять тем, какой именно тип использует среда для хранения переменной - точнее она может спокойно "перевести" целое число в вещественное, и в итоге "потерять копейку"), либо специальные денежные типы - currency в фоксе.


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Оператор %, глюк
of63
Автор

Сообщений: 25161
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
Суммы взяты не из БД фокса, а из экселя. Уже при приеме а переменную s = .Cells(i,j).Value возникают "неоднозначности". Даже "целое" число (когда ячейка сформатирована как число) возвращает не совсем целое число... Задача была - отличить колонку с суммами (числа без дробных копеек, т.е. <=2 знака после запятой), от колонки с числами >2 знака после запятой, и заодно найти колонку с целыми числами... Ну, такой "ИИ" по анализу содержимого файла Эксель, чтобы приемник не принимал явно не те строки, а только заданные метаформатом типа: "сумма, ФИО, таб.номер, ...".
Ratings: 0 negative/0 positive
Re: Оператор %, глюк
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Когда в экселе ячейка имеет формат "числа", то там ЯВНО задаётся число знаков после запятой. Т.к. хранится в поле может, к примеру, число 1.111111111 а заданный формат ячейки приведёт к тому что ВИДИМО пользователю будет 1.11 - так что само "значение", тем более что оно может быть и результатом расчёта по формуле, вынимать я бы не спешил (для анализа).
Впрочем я большой пессимист по поводу всякого рода ИИ, "угадывающего" в какой колонке ФИО, в какой возраст а в какой причитающаяся к уплате сумма
Надёжнее показать юзеру (превью данных, скажем так) и пускай сам тыкает пальцем мышкой, разнося экселевские колонки по полям БД...
А там уже явными округлениями/отсечениями приводить числа в требуемый вид.


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Оператор %, глюк
of63
Автор

Сообщений: 25161
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
> Когда в экселе ячейка имеет формат "числа", то там ЯВНО задаётся число знаков после запятой.
формат я не читаю (часто указан неадекватный, или общий), а читаю только .Value ячейки, из него и строю предположения о том, что там лежит... Для этого есть анализатор текста, который угадывает по тексту его "предполагаемый" тип (грубо "если все цифры то это число", или "все цифры, но цифр много - это не число", или "все цифры, и контрольная сумма, как для ИНН, говорит что это ИНН")

По поводу пессимизма про автоопределение назначения колонки - удобно бывает все-таки предугадать хоть что-то, а потом уже предлагать дотыкать непонятное на листе эксель (и то, я не пробовал ловить события на листе эксель и передавать их в фокс...). В 99% случаев ловит как надо, и это очень удобно. ФИО отличить от неФИО просто, также ИНН, СНИЛС, паспорт... Основная проблема, даже при знании назначения колонок, найти начало блока с данными, конец блока, найти прогалы в данных (пустые и полупустые строки), а для этого и приходится отличать ФИО от "ИТОГО", или заголовка колонки. Да заголовок колонки тоже хорошо бы находить (обычно это текст на 1 выше блока данных).
Ratings: 0 negative/0 positive
Re: Оператор %, глюк
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Я не имел в виду в экселе тыкать - забрать данные в фокс (например первые 10 строк), и там уже показав пользователю решать что за оно. Конечно же это не позволит вынимать данные из совершенно произвольного листа - где, к примеру, первые 100500 строк пустые, а потом уже пойдут данные - да ещё и "1 заполненная строка через 10 пустых"
P.S. Бог миловал от разгребания такого дерьма

P.P.S. А Итого неплохая фамилия


------------------
WBR, Igor




Исправлено 1 раз(а). Последнее : Igor Korolyov, 12.09.17 18:29
Ratings: 0 negative/0 positive
Re: Оператор %, глюк
of63
Автор

Сообщений: 25161
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
Больше всех получает
Ratings: 0 negative/0 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 28 WbrErr  (Гостей: 27)

© 2000-2024 Fox Club 
Яндекс.Метрика