Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Округление чисел [D6, WinXP]


Страницы:   1 2

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


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо