![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Округление до целого [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))