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);
Вообще в Паскале есть процедура с анналогичным названием, но моя обладает большими возможностями
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!
|
|
Valdemar |
Отправлено: 13.02.2004, 13:19 |
|
Мастер участка
Группа: Участник
Сообщений: 433
|
Что-то я не понял вашей формулы, особенно деление на 100.
Если вы хотите показать сумму, округленную до копеек, то можно сделать примерно так:
CODE | Label->Caption=Format("%.2f руб.", ARRAYOFCONST((summa))); |
Маленький совет: используйте округление результата только при показе его пользователю или когда результат округления не будет участвовать в дальнейших вычислениях. Иначе ошибка округления будет нарастать и в итоге вы получите результат, сильно отличающийся от того, который должен быть. |
|
trigger |
Отправлено: 13.02.2004, 14:01 |
|
Не зарегистрирован
|
хочу дополнить совет Valdemar'а:
если округление делается для бухгалтерии (как в данном случае), все же следует округлять значения до 2-х знаков после запятой (копейки, цента, ....), потаму что именно так считают бухгалтера. и если прога будет считать по другому, может вылезти расхождение.
а в случае если есть несколько этапов расчетов, то тут я думаю нужно консультироваться непосредственно с главбухом — делать ли округление при промежуточных расчетах или только в конце...
) понятно изложил? |
|
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 и т.п. |
|
|