C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Мне нужно для бухгалтерии подсчитать сумму и округ, Я делаю так: ......
Tlik
  Отправлено: 13.02.2004, 09:12


Не зарегистрирован







Мне нужно для бухгалтерии подсчитать сумму и округлить её.
Данные беру из БД.

Суммы у меня в переменных: double Sum1=0.00, Sum2=0.00, Sum3=0.00;


Я делаю так:

Sum3 = (Sum1 — Sum2 — SumN) / 100;


Сумма по платежу: Sum3.


Насколько это правильно, и если не верно, то как это сделать правильно.
Я не силен в этом.(
Doga
Отправлено: 13.02.2004, 13:15


Мастер участка

Группа: Участник
Сообщений: 575



double Round(double Value, int Precision);

Вообще в Паскале есть процедура с анналогичным названием, но моя обладает большими возможностями smile.gif

Round возвращает округлённое значение Value с точностью Precision.
Т.е. Precision это позиция цифры после запятой(точки) до которой надлежит округлить Value в десятичной записи.
Round работает и с положительными и с отрицательными величинами.

Например:

Round(1999.6745, 2) возвратит 1999.67;
Round(1999.6745, 1) возвратит 1999.7;
Round(1999.6745, 0) возвратит 2000.0;
Round(6769.1536, -2) возвратит 6800.0;

Вот собственно код процедуры:

double Round(double Value, int Precision)
{
bool Reverse = false;
if (Value < 0.0)
{
Value = fabsl(Value);
Reverse = true;
}

int ValP3_1 = (int)(Value * IntPower(10., Precision + 1));
int ValP3_2 = (int)(Value * IntPower(10., Precision)) * 10;
double RetVal;

if (abs(abs(ValP3_1) — abs(ValP3_2)) < 5)
{
RetVal = ((double)((int)(Value * IntPower(10., Precision))))/IntPower(10., Precision);
}
else
{
RetVal = ((double)((int)(Value * IntPower(10., Precision)) + 1))/IntPower(10., Precision);
}

if (Reverse)
{
RetVal *= -1.;
}

return RetVal;
}


ENJOY! biggrin.gif
Valdemar
Отправлено: 13.02.2004, 13:19


Мастер участка

Группа: Участник
Сообщений: 433



Что-то я не понял вашей формулы, особенно деление на 100.
Если вы хотите показать сумму, округленную до копеек, то можно сделать примерно так:
CODE
Label->Caption=Format("%.2f руб.", ARRAYOFCONST((summa)));

Маленький совет: используйте округление результата только при показе его пользователю или когда результат округления не будет участвовать в дальнейших вычислениях. Иначе ошибка округления будет нарастать и в итоге вы получите результат, сильно отличающийся от того, который должен быть.
trigger
Отправлено: 13.02.2004, 14:01


Не зарегистрирован







хочу дополнить совет Valdemar'а:
если округление делается для бухгалтерии (как в данном случае), все же следует округлять значения до 2-х знаков после запятой (копейки, цента, ....), потаму что именно так считают бухгалтера. и если прога будет считать по другому, может вылезти расхождение.
а в случае если есть несколько этапов расчетов, то тут я думаю нужно консультироваться непосредственно с главбухом — делать ли округление при промежуточных расчетах или только в конце...
smile.gif) понятно изложил?
reality
Отправлено: 16.02.2004, 14:29


Не зарегистрирован







Sum1 — итоговая сумма.
Sum2 — комисия1.
SumN — комисияN.
Sum3 — округленная сумма без комисии, для записи в БД.

Sum3 = (Sum1 — Sum2 — SumN) / 100;

сначала я вычитаю комиссию, потом делю на сто.
(почему на сто?! так мне посоветовал один знакомый программер)


QUOTE

Valdemar
Я правильно Вас понял:

Мой код:

Sum3 = Sum1 — Sum2 — SumN;

Label->Caption=Format("%.2f руб.", ARRAYOFCONST((Sum3)));


А что такое: %.2f руб.",..
Valdemar
Отправлено: 16.02.2004, 16:26


Мастер участка

Группа: Участник
Сообщений: 433



%.2f — указывает формат строки, которая будет взята из параметра и подставлена на место этой конструкции.
.2 — точность, т.е. 2 знака после запятой
f — тип переменной
Подробнее смотрите в справке на темы: Format, Format string. Аналогичное форматирование используется в функциях printf, scanf и т.п.

Вернуться в Вопросы программирования в C++Builder