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

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

Округление функция 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

это как????????


Наверх

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