Форум программистов, компьютерный форум, киберфорум
C++ Builder: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.71/21: Рейтинг темы: голосов - 21, средняя оценка - 4.71
 Аватар для FreeWay
84 / 84 / 19
Регистрация: 17.12.2007
Сообщений: 574

Подсчет суммы в таблице (неверно считает)

06.01.2009, 23:37. Показов 3981. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет, наткнулся на не понятную проблему.
У меня есть таблица (файл dbf), по определенному полю мне надо подбить сумму, делаю это таким кодом:

C++
1
2
3
4
5
6
7
8
9
10
11
12
   int n=2;
   String FieldName = DBGrid1->SelectedField->FieldName;
   float sum=0;
   Table1->First();
   while (!Table1->Eof)
   {
    sum=sum+Table1->FieldByName(FieldName)->AsFloat;
    Table1->Next();
   }
 
   LabelSum->Caption=FloatToStrF(sum,ffNumber,8,2)+" Грн";
   LabelCout->Caption=IntToStr(Table1->RecordCount)+" Строк";
работаю через BDE
проблема в том, что сумма хоть и редко, но бывает от одной до нескольких копеек не идет с реальной суммой. Если открыть дбф файл в экселе и подбить сумму, то он правильно суммирует.
Я так понимаю проблема в округлении, вернее в его отсутствии. Пробую такое округление -

C++
1
2
3
4
5
6
7
8
9
10
11
12
int n=2;
   String FieldName = DBGrid1->SelectedField->FieldName;
   float sum=0;
   Table1->First();
   while (!Table1->Eof)
   {
    sum=sum+Table1->FieldByName(FieldName)->AsFloat;
   [COLOR=red] sum=floor(sum*pow10(n)+0.5)*pow10(-n);[/COLOR]
    Table1->Next();
   }
LabelSum->Caption=FloatToStrF(sum,ffNumber,8,2)+" Ãðí.";
   LabelCout->Caption=IntToStr(Table1->RecordCount)+" ñòðîê";
но с ним несоответствие с реальной суммой выростает(
Подскажите как это правильно решить?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
06.01.2009, 23:37
Ответы с готовыми решениями:

Подсчет суммы по колонке в таблице
Помогите. Не знаю как подсчитать сумму в колонке. Все значения из колонки(сумма) должны суммироваться и выводится в Label2 (Итого).

подсчет суммы повторяющихся записей в таблице
Ребята, нужна помощь. Пишу программу сверки двух ведомостей из других программ (бд Access). Эти ведомости подгружаются в мою программу...

Подсчет суммы по выбранным колонкам в таблице
Ребят такой вопрос, в общем у меня есть таблица "Препараты" которая состоит из следующих колонок: код препарата, наименование, упаковка,...

8
Почетный модератор
 Аватар для Lord_Voodoo
8785 / 2538 / 144
Регистрация: 07.03.2007
Сообщений: 11,873
06.01.2009, 23:50
вот код математического округления:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
double MathRound(double num, int precision)
{
  AnsiString s, number = FloatToStr(num);
  bool sign = false;
  double k;
  int pos = number.Pos('.');
  int len = number.Length();
  if ((pos == 0) || ((len - pos) <= precision)) return num;
  AnsiString prom = number.SubString(1, 1);
  if (prom == '-') sign = true;
  s = number.SubString(pos+precision+1, 1);
  int i = StrToInt(s);
  if (i >= 5){
   if (sign)
     k = floor(num*Power(10, precision))/Power(10, precision);
   else
     k = ceil(num*Power(10, precision))/Power(10, precision);
  }else{
   if (!sign)
     k = floor(num*Power(10, precision))/Power(10, precision);
   else
     k = ceil(num*Power(10, precision))/Power(10, precision);
  }
  return k;
}
только есть подсчетах, особенно в бухгалтерских такая проблема, как расхождение сумм с округлением походу накопления суммы и округления результата... я каждый месяц с балансом играюсь из-за этой проблемы...
0
 Аватар для FreeWay
84 / 84 / 19
Регистрация: 17.12.2007
Сообщений: 574
07.01.2009, 08:56  [ТС]
Цитата Сообщение от WooDooMan Посмотреть сообщение
вот код математического округления:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
double MathRound(double num, int precision)
{
  AnsiString s, number = FloatToStr(num);
  bool sign = false;
  double k;
  int pos = number.Pos('.');
  int len = number.Length();
  if ((pos == 0) || ((len - pos) <= precision)) return num;
  AnsiString prom = number.SubString(1, 1);
  if (prom == '-') sign = true;
  s = number.SubString(pos+precision+1, 1);
  int i = StrToInt(s);
  if (i >= 5){
   if (sign)
     k = floor(num*Power(10, precision))/Power(10, precision);
   else
     k = ceil(num*Power(10, precision))/Power(10, precision);
  }else{
   if (!sign)
     k = floor(num*Power(10, precision))/Power(10, precision);
   else
     k = ceil(num*Power(10, precision))/Power(10, precision);
  }
  return k;
}
только есть подсчетах, особенно в бухгалтерских такая проблема, как расхождение сумм с округлением походу накопления суммы и округления результата... я каждый месяц с балансом играюсь из-за этой проблемы...
не прикольно, значит я не добьюсь точной суммы?
0
 Аватар для FreeWay
84 / 84 / 19
Регистрация: 17.12.2007
Сообщений: 574
07.01.2009, 09:33  [ТС]
попробовал скулом:
C++
1
2
3
4
Query->Close();
Query->SQL->Clear();
Query->SQL->Text=("Select SUM (SUMA) AS Result FROM CARDw");
Query->Open();
посчитал правильно))) Значит у него какой то правильный округлитель встроенный)))
0
Почетный модератор
 Аватар для Lord_Voodoo
8785 / 2538 / 144
Регистрация: 07.03.2007
Сообщений: 11,873
07.01.2009, 11:19
FreeWay, к сожалению, это обусловлено именно математическими причинами, хотя существует систем 6 бухгалтерских округлений... и вообще повысь точность расчетов, т.е. веди расчеты ну с 3-4 знаками после запятой и округление производи только уже при выводе на экран... а вот функция работает точно проверено на коммерческом софте с требовательностью к точности расчетов... покрути ее... и вообще у меня отдел бухгалтерии разрешает погрешность 5 копов...


так в билдере нет математического округления, только до верхенго или нижнего числа, а sql считает с математическим округлением... только будут ситуации, где тебе не получится проскочить мимо округлений отдельных сумм и округлением общей суммы...
0
 Аватар для FreeWay
84 / 84 / 19
Регистрация: 17.12.2007
Сообщений: 574
07.01.2009, 13:01  [ТС]
мне напарник подсчитал сумму в визуал бейсике, у него есть встроенный тип currency, так у него сразу подсчитаолсь правильно.
Я вот думаю на си шарп переходить, там есть тип decimal специально для точных расчетов)
0
Почетный модератор
 Аватар для Lord_Voodoo
8785 / 2538 / 144
Регистрация: 07.03.2007
Сообщений: 11,873
07.01.2009, 14:10
я не проверял, конечно, бейсик на работу с округлениями... но у меня с балансом вечная проблема, чтобы сумма общая совпадала с суммой получаемой из сумм по статьям, хотя между прочим исходные данные одинаковые, только пдв в 20% делает с расчетами чудеса... хотя попробуй, и если у тебя бейсик справится, то и я перейду туда, надоело сводить по 10 копеек каждый месяц
0
 Аватар для FreeWay
84 / 84 / 19
Регистрация: 17.12.2007
Сообщений: 574
07.01.2009, 19:57  [ТС]
Цитата Сообщение от WooDooMan Посмотреть сообщение
я не проверял, конечно, бейсик на работу с округлениями... но у меня с балансом вечная проблема, чтобы сумма общая совпадала с суммой получаемой из сумм по статьям, хотя между прочим исходные данные одинаковые, только пдв в 20% делает с расчетами чудеса... хотя попробуй, и если у тебя бейсик справится, то и я перейду туда, надоело сводить по 10 копеек каждый месяц
неееее на бейсик я не перейду, зачем идти назад). Я буду переходить на cи шарп

вот еще подсказали:

Я бы сделал int sum. А те числа float, которые ты читаешь из файла умножать на 100 и приплюсовывать к sum. Тогда в sum будет целое число копеек и никаких округлений. А чтобы получить результат, надо полученное число поместить в переменную float и поделить на 100.
0
Почетный модератор
 Аватар для Lord_Voodoo
8785 / 2538 / 144
Регистрация: 07.03.2007
Сообщений: 11,873
08.01.2009, 00:10
я точность веду до трех знаков после запятой. а все равно перекосы есть... просто, будь простое решение, то не существовало бы кучи систем округлений... общзую сумму посчитать-то можно точно, но когда идет расписание, как она формировалась, тогда и начинается веселье...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
08.01.2009, 00:10
Помогаю со студенческими работами здесь

Неверно считает
множество всех чисел вида (2^(k)+3^(k)). вот код: #include &quot;stdafx.h&quot; #include &lt;stdio.h&gt; #include &lt;iostream.h&gt; #include...

Неверно считает программа
Неверно считает программа в MathCAD метод Гаусса, помогите выяснить в чем причина, пожалуйста

Программа компилируется, но считает неверно
Программа компилируется ,но считает не верно. unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes,...

Программа неверно считает результат
Здравствуйте! В общем, нужно было составить тест на любую тему. Я всё сделал, но программа почему-то неверно выводит результат. Если...

Anylogic неверно считает CDF?
Здравствуйте! Прошу помощи вот по какому вопросу. У меня Anylogic 7, модель прилагаю. Задача в следующем. Необходимо приближенно...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru