Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.10.24;
Скачать: CL | DM;

Вниз

Округление функция 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;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.023 c
6-1092728369
jek_
2004-08-17 11:39
2004.10.24
Почтовая программа


3-1096381121
AlexXn
2004-09-28 18:18
2004.10.24
Оракл тупит


1-1097233522
JMasta
2004-10-08 15:05
2004.10.24
Наглядное хранение записей


3-1095945571
Koala
2004-09-23 17:19
2004.10.24
Перехват ошибки


1-1097111765
vvip
2004-10-07 05:16
2004.10.24
Запуск одной копии приложения