Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / неправильно считается сумма. / 15 сообщений из 15, страница 1 из 1
13.03.2008, 14:42
    #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
13.03.2008, 14:49
    #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
13.03.2008, 14:50
    #35188246
denis_viktorovich
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
неправильно считается сумма.
Если поменять на Numeric то работает.
...
Рейтинг: 0 / 0
13.03.2008, 14:54
    #35188268
PaulWist
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
неправильно считается сумма.
denis_viktorovichЕсли поменять на Numeric то работает.

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

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

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

Твоя смена формата туда-обратно провела пересчет, но проблема вылезет снова. Используй тип NUMERIC(8.2)
...
Рейтинг: 0 / 0
13.03.2008, 15:16
    #35188359
denis_viktorovich
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
неправильно считается сумма.
Причем при следующем расчете все повторяется. Както интересно файл портится, отображается нормально, а при суммировании обрезает.
...
Рейтинг: 0 / 0
13.03.2008, 15:21
    #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
13.03.2008, 15:21
    #35188392
PaulWist
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
неправильно считается сумма.
denis_viktorovichПричем при следующем расчете все повторяется. Както интересно файл портится, отображается нормально, а при суммировании обрезает.

Вам уже Dima T ответил, что Вы пытаетесь делать мат операции с "приблизительным" типом данных, если нужно точное мат соответствие в мат операциях, тогда надо использовать точные типы данных, либо в самой мат операции использовать точные типы данных.
...
Рейтинг: 0 / 0
13.03.2008, 15:24
    #35188408
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
неправильно считается сумма.
denis_viktorovichПричем при следующем расчете все повторяется. Както интересно файл портится, отображается нормально, а при суммировании обрезает.
он не портится, это особенность формата double
...
Рейтинг: 0 / 0
13.03.2008, 17:32
    #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
14.03.2008, 11:00
    #35190194
PaulWist
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
неправильно считается сумма.
Dima T
Проблема в значении 102.71 оно не влазит в N(5,2) и сохранится как 102.7 и ошибки переполнения никакой при этом не будет.


Э-э-э, скорее это не проблема, а "забывчивость", те Вы пытаетесь в 5 знаков 4 цифры+точка запихнуть число из 6-ти знаков.
...
Рейтинг: 0 / 0
14.03.2008, 12:18
    #35190537
Burn
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
неправильно считается сумма.
PaulWistЭ-э-э, скорее это не проблема, а "забывчивость", те Вы пытаетесь в 5 знаков 4 цифры+точка запихнуть число из 6-ти знаков.
Лучше бы он в этой ситуации ошибку генерил и только потом запихивал;)
...
Рейтинг: 0 / 0
14.03.2008, 17:52
    #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
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / неправильно считается сумма. / 15 сообщений из 15, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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