Ошибка суммы!!!

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
JohnK
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 874
Зарегистрирован: 03.08.2002 (Сб) 0:35
Откуда: 48.02` 37.58`

Ошибка суммы!!!

Сообщение JohnK » 14.06.2004 (Пн) 22:59

Есть 20-30 чисел, хранятся в БД.
dim Sum as Currency
Считываю, суммирую и вывожу Format(Sum,"0.00")

Иногда выдает сумму отличную на 0,02 - 0,03 сотых!
ВОПРОС. Как этого избежать так как речь идет о бухгалтерии.
SELECT * FROM girls WHERE tits NOT NULL AND age BETWEEN 18 AND 25 ORDER BY Beauty

codemaster
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 604
Зарегистрирован: 13.02.2004 (Пт) 13:35

Re: Ошибка суммы!!!

Сообщение codemaster » 15.06.2004 (Вт) 9:46

JohnK писал(а):Есть 20-30 чисел, хранятся в БД.
dim Sum as Currency
Считываю, суммирую и вывожу Format(Sum,"0.00")

Иногда выдает сумму отличную на 0,02 - 0,03 сотых!
ВОПРОС. Как этого избежать так как речь идет о бухгалтерии.


Тип поля БД? Как суммируешь ?

Shurrik
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 110
Зарегистрирован: 20.05.2004 (Чт) 5:35
Откуда: Керчь, Крым

Сообщение Shurrik » 16.06.2004 (Ср) 12:46

Если программа для бухгалтерии, то рационально хранить суммы в копейках (длинное целое), тогда любые вычисления автоматически будут округляться, а при выводе раздели сумму на 100.
Колесо: Хочешь жить? Умей вертеться.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 16.06.2004 (Ср) 13:25

Не логично.
Логично не изобретать велосипед, а использовать тип данных Currency (в DAO dbCurrency, в ADO adCurrency).
Lasciate ogni speranza, voi ch'entrate.

codemaster
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 604
Зарегистрирован: 13.02.2004 (Пт) 13:35

Сообщение codemaster » 16.06.2004 (Ср) 14:44

alibek писал(а):Не логично.
Логично не изобретать велосипед, а использовать тип данных Currency (в DAO dbCurrency, в ADO adCurrency).



Вполне логично если система обработки распределенная
и разношерстная. Например
в одном уважаемом немецком банке часть инф. системы
крутится под Mainframe от IBM "суммы" действительно
пишутся в виде целых центов
сделано это из соображений производительности

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 16.06.2004 (Ср) 14:50

В таком случае банк мухлюет :)
В Currency отображается два знака после запятой, но расчеты ведутся с точностью до 4 знаков после запятой (т.е. до сотых цента/копейки). А если все считать в целых центах, то ошибки округления будут выходить немаленькие. Для крупного банка дневной оборот в три-четыре сотни тысяч евро вполне обыденен, а это 30000000-40000000 евроцентов. Пусть банк берет себе только половину от ошибок округления, это получается несколько сотен евро в день. И это только в одном банке (отделении).
Lasciate ogni speranza, voi ch'entrate.

codemaster
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 604
Зарегистрирован: 13.02.2004 (Пт) 13:35

Сообщение codemaster » 16.06.2004 (Ср) 15:24

alibek писал(а):В таком случае банк мухлюет :)
В Currency отображается два знака после запятой, но расчеты ведутся с точностью до 4 знаков после запятой (т.е. до сотых цента/копейки).


Показал шефу. Он с перепугу решил даже закрывать счет в DB и преводить деньги в росс. банк.

Ну и где ведутся расчеты с клиентами
с точностью до 4 знаков после запятой (т.е. до сотых цента/копейки) Я идиот! Убейте меня, кто-нибудь! :wink: :wink: [/b]

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 16.06.2004 (Ср) 15:57

Бедный шеф :)
Нет, как считает банк это вопрос иной. Другое дело, что если банк все-же захочет вести расчеты с максимальной точностью, то на базе Currency это возможно, а на базе Integer не получится (или придется считать не в центах, а в сотых центов и делить на 10000).
Lasciate ogni speranza, voi ch'entrate.

Ennor
Конструктивный критик
Конструктивный критик
 
Сообщения: 2504
Зарегистрирован: 18.12.2001 (Вт) 3:58
Откуда: Калуга -> Москва

Сообщение Ennor » 16.06.2004 (Ср) 20:56

Ага, что по своей сути аналогично тому же Currency. А насчет производительности - этот тип никогда и не был типом с плавающей запятой, это тип с фиксированной запятой. Так что реально там все хранится в виде, характерном для целых типов, и только при вычислениях "вспоминается", что надо делить на 10 000. Кроме того, в нем 8 байт, а не 4.

JohnK
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 874
Зарегистрирован: 03.08.2002 (Сб) 0:35
Откуда: 48.02` 37.58`

Сообщение JohnK » 19.06.2004 (Сб) 0:12

Использовал Currency,
не то.
:(

А как насчет Round?
SELECT * FROM girls WHERE tits NOT NULL AND age BETWEEN 18 AND 25 ORDER BY Beauty


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Google-бот и гости: 14

    TopList