![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Округление чисел [D6, WinXP]
sergeii © (2004-07-12 17:52:00)Как можно округлить число до 0,00 такого формата. Когдато в форуме видел линк на функцию округления
Ega23 (2004-07-12 19:12:00) [1]А я делал задачу округления показаний счетчиков (несколько десятков штук) и заранее заказчик не знал, "скока вешать" и пришлось задавать число знаков в INI файле, чтобаы не переписывать прогу.
Это другое дело, тут по-другому - никак.
А вообще - это бесполезный спор - каждый делает так, как ему удобнее.
100% в точку.
ASMiD (2004-07-12 19:02:00) [2]Виноват, действительно выложил не тот пример.
Для финансов Ok.
А я делал задачу округления показаний счетчиков (несколько десятков штук) и заранее заказчик не знал, "скока вешать" и пришлось задавать число знаков в INI файле, чтобаы не переписывать прогу.
А вообще - это бесполезный спор - каждый делает так, как ему удобнее.
Ega23 (2004-07-12 18:56:00) [3]ASMiD (12.07.04 18:31) [18]
Ну да, медленный, это я и хотел сказать.
Как правило, округление до второго-третьего знака нужно, когда работаешь с финансовой системой. Общая функция округления до N-го знака в таком случае будет ненужна. А вот если задача стоит написать действительно УНИВЕРСАЛЬНУЮ функцию, то тогда, конечно, Value:=round(IntPower(10,100)*Value)/IntPower(10,100); будет верно (в случае, если система счисления - десятичная :о) ).
case dcc of
0:Str(Val:1:0,st1);
1:Str(Val:3:1,st1);
2:Str(Val:4:2,st1);
3:Str(Val:5:3,st1);
4:Str(Val:6:4,st1);
end;
А здесь ты не ОКРУГЛЯЕШЬ число. Ты только подгоняешь его строковое представление.
ASMiD (2004-07-12 18:31:00) [4]Не спорю, но не громоздкий, а более медленный, а при случае, если заранее число знаков не известно, то по написанию то и более громоздкий
case dcc of
0:Str(Val:1:0,st1);
1:Str(Val:3:1,st1);
2:Str(Val:4:2,st1);
3:Str(Val:5:3,st1);
4:Str(Val:6:4,st1);
end;
Ega23 (2004-07-12 18:23:00) [5]Зато на все случаи жизни для произвольного количества знаков.
Я думал это понятно.
Это понятно, но этот способ слишком громоздкий. Гораздо проще написать 3 функции Round1, Round2, Round3 и пользоваться ими.
ASMiD (2004-07-12 18:21:00) [6]
> Вы бы сначала проверили, а потом бы так категорично утверждали.
Это точно.
Ega23 (2004-07-12 18:20:00) [7]Андрей (12.07.04 18:15) [11]
Проверь данный код:
procedure TForm1.Button4Click(Sender: TObject);
var
d:double;
ss:string;
begin
d:=12.49;
d:=Round(d*100)/100;
Str(d:10:4,ss);
Label1.Caption:=ss;
end;
Одно дело представление на экране, другое дело значение самой переменной.
Семен Сорокин (2004-07-12 18:18:00) [8]
> Андрей (12.07.04 18:15) [11]
> Странный скептицизм. На самом деле задание формата не округляет
> число. В Паскале это было так (например)
> var b: real;
> b:=1,359
> writeln b:2:2;
> и на экране мы видели 1.35
> Наксколько я понимаю понятие формата и округления с тех
> пор не изменились
Вы бы сначала проверили, а потом бы так категорично утверждали.
ASMiD (2004-07-12 18:18:00) [9]
> Осталось ещё логарифмы с экспонентой привлечь. И через CORBA
> Server всё считать. В отдельном потоке.
Зато на все случаи жизни для произвольного количества знаков.
Я думал это понятно.
Андрей (2004-07-12 18:17:00) [10]Во я только что попробовал - FormatFloat действительно не округляет
Андрей (2004-07-12 18:15:00) [11]
> Ega23 © (12.07.04 18:09) [9]
> Андрей (12.07.04 17:59) [7]
>
> Ну да?
Странный скептицизм. На самом деле задание формата не округляет число. В Паскале это было так (например)
var b: real;
b:=1,359
writeln b:2:2;
и на экране мы видели 1.35
Наксколько я понимаю понятие формата и округления с тех пор не изменились
Ega23 (2004-07-12 18:11:00) [12]ASMiD (12.07.04 17:59) [6]
Осталось ещё логарифмы с экспонентой привлечь. И через CORBA Server всё считать. В отдельном потоке.
Ega23 (2004-07-12 18:09:00) [13]Андрей (12.07.04 17:59) [7]
Ну да?
Андрей (2004-07-12 18:00:00) [14]to ASMiD
Совершенно верно
Андрей (2004-07-12 17:59:00) [15]to Семен Сорокин
В таком случае
12,49 -> 12,4
а не 12,5
ASMiD (2004-07-12 17:59:00) [16]Value:=round(IntPower(10,100)*Value)/IntPower(10,100);
Ega23 (2004-07-12 17:58:00) [17]sergeii © (12.07.04 17:57) [2]
Слушай Тимохова ©, он знает что говорит.
Семен Сорокин (2004-07-12 17:57:00) [18]FormatFloat('0.00', Value)
Андрей (2004-07-12 17:57:00) [19]Round ???????????
Trunc ???????????
sergeii (2004-07-12 17:57:00) [20]Когдато в фруме встречал линк на то как записать число словом, так там и алгоритм округления был. Т.Е. 12,506895 = 12,51