Форум: "Основная";
Текущий архив: 2004.10.24;
Скачать: [xml.tar.bz2];
ВнизОкругление функция Round Найти похожие ветки
← →
Koala © (2004-09-26 13:51) [0]Как правильно сделать?
При сложении значений 13 + 0,650 + 2,600 = 16,250 после округления до десятых по правилам математики должно получится 13,3 у меня получается 13,2.
Использую функцию так:
Round(значение * 10)/ 10;
← →
YurikGL © (2004-09-26 13:58) [1]
> 16,250 после округления до десятых по правилам математики
> должно получится 13,3
это как????????
← →
jack128 © (2004-09-26 14:22) [2]Что для банковского округления, что для математического получится 13,2
А вообще - читать статью на Королевстве Дельфи "Неочевидные особенности вещественных чисел"
← →
Koala © (2004-09-26 15:33) [3]YurikGL © (26.09.04 13:58) [1]
очепятка
напечатанное
должно получится 13,3 у меня получается 13,2.
читать
должно получится 16,3 у меня получается 16,2.
← →
Koala © (2004-09-26 16:13) [4]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
← →
Пчелка © (2004-09-26 16:21) [5]Придумала ф-ю 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;
← →
jack128 © (2004-09-26 16:26) [6]Koala © (26.09.04 16:13) [4]
> то число округляется к четному целому, в данном случае
> к 2.
так чем же ты не доволен?? Вот те и оклуглили к четному 16,250 -> 16.2
← →
Koala © (2004-09-26 16:51) [7]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;
← →
Koala © (2004-09-26 17:53) [8]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
← →
Defunct © (2004-09-26 18:30) [9]Koala © (26.09.04 13:51)
Round(значение * 10 + 0.00001)/ 10;
← →
Koala © (2004-09-26 18:35) [10]Пчелка © (26.09.04 16:21) [5]
Ваше решение наиболее подходящее....
Спасибо....
← →
Defunct © (2004-09-26 18:42) [11]Koala © (26.09.04 18:35) [10]
не настаиваю, но посмотрите [9] округлит математически.
порядок доп. единички после запятой (в примере это+0.00001
) должен быть меньше чем порядок наименьшего значашего знака после запятой.
можно задаться константойConst E=0.0000000000001;
И прибавлять ее к числу при округлении. Подойдет практически на все случаи жизни.Round( Число + E )
← →
Koala © (2004-09-26 19:15) [12]Defunct © (26.09.04 18:42) [11]
Спасибо огромное...
Действительно подходит :о)-------------------------------
А ларчик просто открывался :о)
-------------------------------
← →
Роман (2004-10-06 17:50) [13]Result:=Trunc(E*(1/Pr)+0.5)*Pr;
Е - округляемое число
Pr - точность (Например до сотых:0.01)
← →
OSokin © (2004-10-06 19:16) [14]
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 - до десятых и т. д.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.10.24;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.033 c