powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / неправильно считается сумма.
15 сообщений из 15, страница 1 из 1
неправильно считается сумма.
    #35188201
denis_viktorovich
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Интересную штуку отловил. Задача на VFP 7 SP1, имеется таблица, в ней есть числовое поле double (8.2), содержимое следующее:
2.71
0.67
3.06
1.47

calculate sum(fld1) TO c1
? c1
Показывает 7.90 вместо ожидаемого 7.91. Кто нибудь знает изз-за чего это и как бороться?
...
Рейтинг: 0 / 0
неправильно считается сумма.
    #35188238
PaulWist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не верю

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
CREATE CURSOR test (f1 b( 2 ))

INSERT INTO test (f1) VALUES ( 2 . 71 )
INSERT INTO test (f1) VALUES ( 0 . 67 )
INSERT INTO test (f1) VALUES ( 3 . 06 )
INSERT INTO test (f1) VALUES ( 1 . 47 )

calculate sum(f1) TO c1
? c1
...
Рейтинг: 0 / 0
неправильно считается сумма.
    #35188246
denis_viktorovich
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если поменять на Numeric то работает.
...
Рейтинг: 0 / 0
неправильно считается сумма.
    #35188268
PaulWist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
denis_viktorovichЕсли поменять на Numeric то работает.

Не понял, что менять-то, у Вас мой пример выдаёт значение 7.90 ?
...
Рейтинг: 0 / 0
неправильно считается сумма.
    #35188297
denis_viktorovich
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пардон, не обновив топик ответил. Ваш пример нормально работает. Я поменял тип поля на numeric - все стало нормально. Поменял обратно тоже все ОК. Таблицу создаю посредством select * into DBF ...
...
Рейтинг: 0 / 0
неправильно считается сумма.
    #35188307
denis_viktorovich
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Т.е. суммироваться адекватно моя таблица начала после того ка я поменял это поле (туда и обратно :-) )
...
Рейтинг: 0 / 0
неправильно считается сумма.
    #35188343
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
denis_viktorovich...
Кто нибудь знает изз-за чего это и как бороться?
Из-за double. Сделай тип NUMERIC(8.2)

Если кратко: double хранится в двоичном виде с плавающей запятой и при преобразовании того что после запятой 100% точности не получается, ошибка в 7-8 знаке. Вот погрешность и вылазит. Старинная проблема, из-за нее тип CURRENCY (он же MONEY) придумали, двоично-десятичную систему в процессоры добавили.

double можно использовать когда разброс значений огромен, а погрешность не принципиальна, т.е. ошибка в 7-8 знаке. В твоем случае вероятно ошибка накопилась ранее, т.к. пример PaulWist ее не подтверждает.

Твоя смена формата туда-обратно провела пересчет, но проблема вылезет снова. Используй тип NUMERIC(8.2)
...
Рейтинг: 0 / 0
неправильно считается сумма.
    #35188359
denis_viktorovich
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Причем при следующем расчете все повторяется. Както интересно файл портится, отображается нормально, а при суммировании обрезает.
...
Рейтинг: 0 / 0
неправильно считается сумма.
    #35188391
denis_viktorovich
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T denis_viktorovich...
Кто нибудь знает изз-за чего это и как бороться?
Из-за double. Сделай тип NUMERIC(8.2)

Если кратко: double хранится в двоичном виде с плавающей запятой и при преобразовании того что после запятой 100% точности не получается, ошибка в 7-8 знаке. Вот погрешность и вылазит. Старинная проблема, из-за нее тип CURRENCY (он же MONEY) придумали, двоично-десятичную систему в процессоры добавили.

double можно использовать когда разброс значений огромен, а погрешность не принципиальна, т.е. ошибка в 7-8 знаке. В твоем случае вероятно ошибка накопилась ранее, т.к. пример PaulWist ее не подтверждает.

Твоя смена формата туда-обратно провела пересчет, но проблема вылезет снова. Используй тип NUMERIC(8.2)

Спасибо всем. Пожалуй надо и правда numeric использовать. Интересно, задача не мной написана и почемуто раньше не обращали внимания на это. Век живи, век учись, .....
...
Рейтинг: 0 / 0
неправильно считается сумма.
    #35188392
PaulWist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
denis_viktorovichПричем при следующем расчете все повторяется. Както интересно файл портится, отображается нормально, а при суммировании обрезает.

Вам уже Dima T ответил, что Вы пытаетесь делать мат операции с "приблизительным" типом данных, если нужно точное мат соответствие в мат операциях, тогда надо использовать точные типы данных, либо в самой мат операции использовать точные типы данных.
...
Рейтинг: 0 / 0
неправильно считается сумма.
    #35188408
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
denis_viktorovichПричем при следующем расчете все повторяется. Както интересно файл портится, отображается нормально, а при суммировании обрезает.
он не портится, это особенность формата double
...
Рейтинг: 0 / 0
неправильно считается сумма.
    #35189026
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
denis_viktorovich... Интересно, задача не мной написана и почемуто раньше не обращали внимания на это. .....
Раньше техника послабее была, винты поменьше, памяти меньше, сетка 10мбит ... Поэтому всеми способами старались минимизировать объем хранимых данных для повышения производительности. Хотя это и сейчас актуально, может не так сильно. Может разработчик и знал о проблеме, но счел ее менее важной чем снижение производительности.

С NUMERIC тоже можно на копейках попасться:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
CREATE CURSOR test (f1 N( 5 , 2 ))

INSERT INTO test (f1) VALUES ( 102 . 71 )
INSERT INTO test (f1) VALUES ( 0 . 67 )
INSERT INTO test (f1) VALUES ( 3 . 06 )
INSERT INTO test (f1) VALUES ( 1 . 47 )

calculate sum(f1) TO c1
? c1
ответ будет 107.90, а не 107.91 как ожидается.
Проблема в значении 102.71 оно не влазит в N(5,2) и сохранится как 102.7 и ошибки переполнения никакой при этом не будет.

Для денежных сумм специально придумали еще тип CURRENCY (в MS-SQL MONEY), обрабатывается как восьмибайтное двоичное целое, отображается со сдвигом на 4 десятичных знака, нет никаких погрешностей при сложении, вычитании, умножении, но есть подводные камни при делении (результат до 4-х знаков после запятой округляется). т.е. 1.2345 / 100 * 100 => 1.2300

Надо просто все это знать перед тем как использовать.
...
Рейтинг: 0 / 0
неправильно считается сумма.
    #35190194
PaulWist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T
Проблема в значении 102.71 оно не влазит в N(5,2) и сохранится как 102.7 и ошибки переполнения никакой при этом не будет.


Э-э-э, скорее это не проблема, а "забывчивость", те Вы пытаетесь в 5 знаков 4 цифры+точка запихнуть число из 6-ти знаков.
...
Рейтинг: 0 / 0
неправильно считается сумма.
    #35190537
Burn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PaulWistЭ-э-э, скорее это не проблема, а "забывчивость", те Вы пытаетесь в 5 знаков 4 цифры+точка запихнуть число из 6-ти знаков.
Лучше бы он в этой ситуации ошибку генерил и только потом запихивал;)
...
Рейтинг: 0 / 0
неправильно считается сумма.
    #35191949
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PaulWist Dima T
Проблема в значении 102.71 оно не влазит в N(5,2) и сохранится как 102.7 и ошибки переполнения никакой при этом не будет.


Э-э-э, скорее это не проблема, а "забывчивость", те Вы пытаетесь в 5 знаков 4 цифры+точка запихнуть число из 6-ти знаков.
Какой ты догадливый Не надо буквально воспринимать примеры, они простые только для того чтобы их легко понять было, проявляй немного фантазии :)

Реально было так (лет десять назад). В проге была оборотная ведомость по покупателям (остаток, отгружено, оплачено), которая предварительно сохранялась в курсор, поля сумм были N(10, 2) т.е. до 10 млн.р. разрядности хватало. И в один прекрасный дель появился контрагент, по которому оборот перевалил за 10 млн.р., копейки обрезались, а т.к. остаток на конец считался как остаток на начало + приход - расход, то этот конечный остаток не совпал с остатком на начало следующего периода (который считался правильно). На 3 копейки, мне тогда главбухша долго эти три копейки забыть не могла, они там отчеты все в налоговую посдавали, дотошная попалась :)

После того случая для денег мне больше тип MONEY нравится.
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / неправильно считается сумма.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]