![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Округление функция Round
Koala © (2004-09-26 13:51:00)Как правильно сделать?
При сложении значений 13 + 0,650 + 2,600 = 16,250 после округления до десятых по правилам математики должно получится 13,3 у меня получается 13,2.
Использую функцию так:
Round(значение * 10)/ 10;
OSokin (2004-10-06 19:16:00) [1]
function RoundEx( X: Double; Precision : Integer ): Double;
var ScaledFractPart, Temp : Double;
begin
ScaledFractPart := Frac(X)*Precision;
Temp := Frac(ScaledFractPart);
ScaledFractPart := Int(ScaledFractPart);
if Temp >= 0.5 then ScaledFractPart := ScaledFractPart + 1;
if Temp <= -0.5 then ScaledFractPart := ScaledFractPart - 1;
RoundEx := Int(X) + ScaledFractPart/Precision;
end;
Precision - точность.
10 - до десятых и т. д.
Роман (2004-10-06 17:50:00) [2]Result:=Trunc(E*(1/Pr)+0.5)*Pr;
Е - округляемое число
Pr - точность (Например до сотых:0.01)
Koala (2004-09-26 19:15:00) [3]Defunct © (26.09.04 18:42) [11]
Спасибо огромное...
Действительно подходит :о)
-------------------------------
А ларчик просто открывался :о)
-------------------------------
Defunct (2004-09-26 18:42:00) [4]Koala © (26.09.04 18:35) [10]
не настаиваю, но посмотрите [9] округлит математически.
порядок доп. единички после запятой (в примере это+0.00001) должен быть меньше чем порядок наименьшего значашего знака после запятой.
можно задаться константой
Const E=0.0000000000001;
И прибавлять ее к числу при округлении. Подойдет практически на все случаи жизни.
Round( Число + E )
Koala (2004-09-26 18:35:00) [5]Пчелка © (26.09.04 16:21) [5]
Ваше решение наиболее подходящее....
Спасибо....
Defunct (2004-09-26 18:30:00) [6]Koala © (26.09.04 13:51)
Round(значение * 10 + 0.00001)/ 10;
Koala (2004-09-26 17:53:00) [7]I. МАТЕМАТИЧЕСКИЕ ФУНКЦИИ И ПРОЦЕДУРЫ
1. Арифметические функции и процедуры
--------------------------------------------------------------------------------
Функция Round ( X: Extended ): Int64;
--------------------------------------------------------------------------------
Модуль: System
Описание
Функция округляет значение аргумента X к ближайшему целому числу.
Если указанное значение аргумента находится ровно посредине между двумя целыми, например 1.5, то число округляется к четному целому, в данном случае к 2. Если результат функции выходит за пределы Int64, то возникает исключение EInvalidOp.
Пример
var
y1, y2, y3: Real;
begin
...
y1:= Round( 1.4 ); { y1:= 1 }
y2:= Round( 1.5 ); { y2:= 2 }
y3:= Round(-1.5 ); { y3:=-2 }
...
end;
http://www.atrussk.ru/delphi/5/math/math5120.htm
Koala (2004-09-26 16:51:00) [8]jack128 © (26.09.04 16:26) [6]
Returns the value of X rounded to the nearest whole number.
Unit
System
Category
arithmetic routines
function Round(X: Extended): Int64;
Description
The Round function rounds a real-type value to an integer-type value.
X is a real-type expression. Round returns an Int64 value that is the value of X rounded to the nearest whole number. If X is exactly halfway between two whole numbers, the result is always the even number. This method of rounding is often called “Banker’s Rounding”.
If the rounded value of X is not within the Int64 range, a run-time error is generated, which can be handled using the EInvalidOp exception.
Note: The behavior of Round can be affected by the Set8087CW procedure or SetRoundMode function.
var
S, T: string;
begin
Str(1.4:2:1, T);
S := T + ' rounds to ' + IntToStr(Round(1.4)) + #13#10;
Str(1.5:2:1, T);
S := S + T + ' rounds to ' + IntToStr(Round(1.5)) + #13#10;
Str(-1.4:2:1, T);
S := S + T + ' rounds to ' + IntToStr(Round(-1.4)) + #13#10;
Str(-1.5:2:1, T);
S := S + T + ' rounds to ' + IntToStr(Round(-1.5));
MessageDlg(S, mtInformation, [mbOk], 0);
end;
jack128 (2004-09-26 16:26:00) [9]Koala © (26.09.04 16:13) [4]
> то число округляется к четному целому, в данном случае
> к 2.
так чем же ты не доволен?? Вот те и оклуглили к четному 16,250 -> 16. 2
Пчелка (2004-09-26 16:21:00) [10]Придумала ф-ю RealRound, которая, кажется, нормально округляет:
//procedure TForm1.Button1Click(Sender: TObject);
function RealRound(x:real{что округляем};k:byte{ск-ко знаков после запятой будет}):real;
var p:real;
begin
p:=x*power(10,k);
if ((p-trunc(p))>=0.5) then
RealRound:=(trunc(p)+1)/power(10,k)
else RealRound:=trunc(p)/power(10,k)
end;
//begin
//showmessage(floattostr(realround(StrToFloat(edit1.Text),1)));
//end;
Koala (2004-09-26 16:13:00) [11]jack128 © (26.09.04 14:22) [2]
>jack128 © (26.09.04 14:22) [2][Ответить]
> Что для банковского округления, что для
> математического получится 16,2
Это почему же должно получиться 16,2???
Функция Round округляет значение аргумента X к ближайшему целому числу.
Если указанное значение аргумента находится ровно посредине между двумя целыми, например 1.5, то число округляется к четному целому, в данном случае к 2.
http://gweep.by.ru/Delphi/02/01/01_020.shtml
Koala (2004-09-26 15:33:00) [12]YurikGL © (26.09.04 13:58) [1]
очепятка
напечатанное
должно получится 13,3 у меня получается 13,2.
читать
должно получится 16,3 у меня получается 16,2.
jack128 (2004-09-26 14:22:00) [13]Что для банковского округления, что для математического получится 13,2
А вообще - читать статью на Королевстве Дельфи "Неочевидные особенности вещественных чисел"
YurikGL (2004-09-26 13:58:00) [14]
> 16,250 после округления до десятых по правилам математики
> должно получится 13,3
это как????????