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

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

Округление до целого [D5]


R ©   (2004-12-14 11:44:00) 

Подскажите, есть ли стандартный алгоритм(функция)
округляющая дробное число по такому принципу  до целого числа

1,4=1
1,45=2
1,447=2
1,443=1
т.е. если за округляемой цифрой стоит число в диапазоне [5..9] то к ней прибавляем 1,
если менее 5, то ничего ни прибавляем.

Еще для примера
число 1,4549

идем с конца 9 > 5, значит 4 округляем до 5
получается 1,455
далее 1,46
далее 1,5
и наконец 2


Gloomer   (2004-12-14 15:37:00) [1]

Бредовая получается функция :-)
что-то типа

function RoundXXX(f:double):integer;
var s:string;
 z,i:integer;
begin
s:=FloatToStr(f);
z:=pos(',',s);//',' - разделитель дроб.части в системе
if z>0 then
 for i:=length(s) downto z+2 do
if (s[i]>='5') then s[i-1]:=char(byte(s[i-1])+1);
result:=Round(StrToFloat(s));
end;


Verg   (2004-12-14 13:03:00) [2]


> R ©   (14.12.04 11:44)
> Подскажите, есть ли стандартный алгоритм(функция)
> округляющая дробное число по такому принципу  до целого
> числа
>
> 1,4=1
> 1,45=2
> 1,447=2
> 1,443=1


То, что ты таким образом описал округлением назвать нельзя.

Ты округляешь до целого, а значит ты должен взять первую цифру перед запятой, а далее


> если за округляемой цифрой стоит {число} цифрав диапазоне [5..9]
> то к ней (к округляемой) прибавляем 1,
> если менее 5, то ничего ни прибавляем.


и все...


Delphi5.01   (2004-12-14 12:58:00) [3]

da blin, sravnenie idot s konca, beru svoi slova obratno.
Togda ostaiotsa odna vesh razbit ostatok na chisla i vruchnui. No doljen bit bolee logkoe reshenie. :-(


Warlock   (2004-12-14 12:58:00) [4]

я попробовал как написал Семен Сорокин ©   (14.12.04 12:14) [4]
TRoundToRange заменил на Integer, вызов
RoundTo(1.2455,-3) дает 1.246
RoundTo(1.2454,-3) дает 1.245


R   (2004-12-14 12:49:00) [5]

>Семен Сорокин ©   (14.12.04 12:14) [4]
К сожалению не то.
procedure TForm1.Button1Click(Sender: TObject);
begin
 Text:=IntToStr(Round(RoundTo(StrToFloat(Edit1.Text), -2)))
end;

function TForm1.RoundTo(const AValue: Double; const ADigit: SmallInt{заменил}): Double;
var
LFactor: Double;
begin
LFactor := IntPower(10, ADigit);
Result := Round(AValue / LFactor) * LFactor;
end;

1,45 дает 1

>Delphi5.01 ©   (14.12.04 12:25) [6]
Не понятна вот эта часть-
sravnivaem desatichnuiu chast s chislom 0,555555555555555. kolichestvo 5 zavisist ot vashei nujdi

>DiamondShark ©   (14.12.04 12:19) [5]
Работать со строкой ?


Delphi5.01   (2004-12-14 12:25:00) [6]

Nu togda esli ia ne oshibaus mojno sdelat tak:
1) Poluchaem celuiu chast
2) poluchaem destichnuiu chast.
sravnivaem desatichnuiu chast s chislom 0,555555555555555. kolichestvo 5 zavisist ot vashei nujdi. Esli polshe to privavlaem k celoi chasti 1 esli net to ostavlaem bez izmeneni.
Kak polchit desatichnuiu chast ne pomnu vrode int i trunc.


DiamondShark   (2004-12-14 12:19:00) [7]

Нет, стандартного нет. Хотя бы по той причине, что машина ничего не знает о десятичных цафрах, а число 1,455, к примеру, в машинной форме вообще не представимо.


Семен Сорокин   (2004-12-14 12:14:00) [8]


> R ©   (14.12.04 12:10) [3]
> RoundTo- в каком модуле эта функция

sorry, это в Math (D7)

function RoundTo(const AValue: Double; const ADigit: TRoundToRange): Double;
var
 LFactor: Double;
begin
 LFactor := IntPower(10, ADigit);
 Result := Round(AValue / LFactor) * LFactor;
end;


R   (2004-12-14 12:10:00) [9]

>Семен Сорокин ©  
RoundTo- в каком модуле эта функция

>Delphi5.01 ©
Round() - по правилу которое я описал не округляет


Delphi5.01   (2004-12-14 11:55:00) [10]

a chem prosto Round() plokh?


Семен Сорокин   (2004-12-14 11:53:00) [11]

Round(RoundTo(Value, -2))


Наверх

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