|
|
|
неправильно считается сумма.
|
|||
|---|---|---|---|
|
#18+
Интересную штуку отловил. Задача на VFP 7 SP1, имеется таблица, в ней есть числовое поле double (8.2), содержимое следующее: 2.71 0.67 3.06 1.47 calculate sum(fld1) TO c1 ? c1 Показывает 7.90 вместо ожидаемого 7.91. Кто нибудь знает изз-за чего это и как бороться? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.03.2008, 14:42 |
|
||
|
неправильно считается сумма.
|
|||
|---|---|---|---|
|
#18+
Не верю Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.03.2008, 14:49 |
|
||
|
неправильно считается сумма.
|
|||
|---|---|---|---|
|
#18+
Если поменять на Numeric то работает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.03.2008, 14:50 |
|
||
|
неправильно считается сумма.
|
|||
|---|---|---|---|
|
#18+
denis_viktorovichЕсли поменять на Numeric то работает. Не понял, что менять-то, у Вас мой пример выдаёт значение 7.90 ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.03.2008, 14:54 |
|
||
|
неправильно считается сумма.
|
|||
|---|---|---|---|
|
#18+
Пардон, не обновив топик ответил. Ваш пример нормально работает. Я поменял тип поля на numeric - все стало нормально. Поменял обратно тоже все ОК. Таблицу создаю посредством select * into DBF ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.03.2008, 15:00 |
|
||
|
неправильно считается сумма.
|
|||
|---|---|---|---|
|
#18+
Т.е. суммироваться адекватно моя таблица начала после того ка я поменял это поле (туда и обратно :-) ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.03.2008, 15:02 |
|
||
|
неправильно считается сумма.
|
|||
|---|---|---|---|
|
#18+
denis_viktorovich... Кто нибудь знает изз-за чего это и как бороться? Из-за double. Сделай тип NUMERIC(8.2) Если кратко: double хранится в двоичном виде с плавающей запятой и при преобразовании того что после запятой 100% точности не получается, ошибка в 7-8 знаке. Вот погрешность и вылазит. Старинная проблема, из-за нее тип CURRENCY (он же MONEY) придумали, двоично-десятичную систему в процессоры добавили. double можно использовать когда разброс значений огромен, а погрешность не принципиальна, т.е. ошибка в 7-8 знаке. В твоем случае вероятно ошибка накопилась ранее, т.к. пример PaulWist ее не подтверждает. Твоя смена формата туда-обратно провела пересчет, но проблема вылезет снова. Используй тип NUMERIC(8.2) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.03.2008, 15:12 |
|
||
|
неправильно считается сумма.
|
|||
|---|---|---|---|
|
#18+
Причем при следующем расчете все повторяется. Както интересно файл портится, отображается нормально, а при суммировании обрезает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.03.2008, 15:16 |
|
||
|
неправильно считается сумма.
|
|||
|---|---|---|---|
|
#18+
Dima T denis_viktorovich... Кто нибудь знает изз-за чего это и как бороться? Из-за double. Сделай тип NUMERIC(8.2) Если кратко: double хранится в двоичном виде с плавающей запятой и при преобразовании того что после запятой 100% точности не получается, ошибка в 7-8 знаке. Вот погрешность и вылазит. Старинная проблема, из-за нее тип CURRENCY (он же MONEY) придумали, двоично-десятичную систему в процессоры добавили. double можно использовать когда разброс значений огромен, а погрешность не принципиальна, т.е. ошибка в 7-8 знаке. В твоем случае вероятно ошибка накопилась ранее, т.к. пример PaulWist ее не подтверждает. Твоя смена формата туда-обратно провела пересчет, но проблема вылезет снова. Используй тип NUMERIC(8.2) Спасибо всем. Пожалуй надо и правда numeric использовать. Интересно, задача не мной написана и почемуто раньше не обращали внимания на это. Век живи, век учись, ..... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.03.2008, 15:21 |
|
||
|
неправильно считается сумма.
|
|||
|---|---|---|---|
|
#18+
denis_viktorovichПричем при следующем расчете все повторяется. Както интересно файл портится, отображается нормально, а при суммировании обрезает. Вам уже Dima T ответил, что Вы пытаетесь делать мат операции с "приблизительным" типом данных, если нужно точное мат соответствие в мат операциях, тогда надо использовать точные типы данных, либо в самой мат операции использовать точные типы данных. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.03.2008, 15:21 |
|
||
|
неправильно считается сумма.
|
|||
|---|---|---|---|
|
#18+
denis_viktorovichПричем при следующем расчете все повторяется. Както интересно файл портится, отображается нормально, а при суммировании обрезает. он не портится, это особенность формата double ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.03.2008, 15:24 |
|
||
|
неправильно считается сумма.
|
|||
|---|---|---|---|
|
#18+
denis_viktorovich... Интересно, задача не мной написана и почемуто раньше не обращали внимания на это. ..... Раньше техника послабее была, винты поменьше, памяти меньше, сетка 10мбит ... Поэтому всеми способами старались минимизировать объем хранимых данных для повышения производительности. Хотя это и сейчас актуально, может не так сильно. Может разработчик и знал о проблеме, но счел ее менее важной чем снижение производительности. С NUMERIC тоже можно на копейках попасться: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. Проблема в значении 102.71 оно не влазит в N(5,2) и сохранится как 102.7 и ошибки переполнения никакой при этом не будет. Для денежных сумм специально придумали еще тип CURRENCY (в MS-SQL MONEY), обрабатывается как восьмибайтное двоичное целое, отображается со сдвигом на 4 десятичных знака, нет никаких погрешностей при сложении, вычитании, умножении, но есть подводные камни при делении (результат до 4-х знаков после запятой округляется). т.е. 1.2345 / 100 * 100 => 1.2300 Надо просто все это знать перед тем как использовать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.03.2008, 17:32 |
|
||
|
неправильно считается сумма.
|
|||
|---|---|---|---|
|
#18+
Dima T Проблема в значении 102.71 оно не влазит в N(5,2) и сохранится как 102.7 и ошибки переполнения никакой при этом не будет. Э-э-э, скорее это не проблема, а "забывчивость", те Вы пытаетесь в 5 знаков 4 цифры+точка запихнуть число из 6-ти знаков. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.03.2008, 11:00 |
|
||
|
неправильно считается сумма.
|
|||
|---|---|---|---|
|
#18+
PaulWistЭ-э-э, скорее это не проблема, а "забывчивость", те Вы пытаетесь в 5 знаков 4 цифры+точка запихнуть число из 6-ти знаков. Лучше бы он в этой ситуации ошибку генерил и только потом запихивал;) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.03.2008, 12:18 |
|
||
|
неправильно считается сумма.
|
|||
|---|---|---|---|
|
#18+
PaulWist Dima T Проблема в значении 102.71 оно не влазит в N(5,2) и сохранится как 102.7 и ошибки переполнения никакой при этом не будет. Э-э-э, скорее это не проблема, а "забывчивость", те Вы пытаетесь в 5 знаков 4 цифры+точка запихнуть число из 6-ти знаков. Какой ты догадливый Не надо буквально воспринимать примеры, они простые только для того чтобы их легко понять было, проявляй немного фантазии :) Реально было так (лет десять назад). В проге была оборотная ведомость по покупателям (остаток, отгружено, оплачено), которая предварительно сохранялась в курсор, поля сумм были N(10, 2) т.е. до 10 млн.р. разрядности хватало. И в один прекрасный дель появился контрагент, по которому оборот перевалил за 10 млн.р., копейки обрезались, а т.к. остаток на конец считался как остаток на начало + приход - расход, то этот конечный остаток не совпал с остатком на начало следующего периода (который считался правильно). На 3 копейки, мне тогда главбухша долго эти три копейки забыть не могла, они там отчеты все в налоговую посдавали, дотошная попалась :) После того случая для денег мне больше тип MONEY нравится. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.03.2008, 17:52 |
|
||
|
|

start [/forum/topic.php?fid=41&msg=35190537&tid=1588037]: |
0ms |
get settings: |
11ms |
get forum list: |
19ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
73ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
64ms |
get tp. blocked users: |
1ms |
| others: | 219ms |
| total: | 408ms |

| 0 / 0 |
