Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.061 c
1-1097131096
Жбан
2004-10-07 10:38
2004.10.24
Механизм работы Application.Terminate


14-1096614150
clickmaker
2004-10-01 11:02
2004.10.24
VB + COM


1-1097174259
RedDragon
2004-10-07 22:37
2004.10.24
Как проверить папку на наличие файл с определённым именем........


8-1091111900
NJoe
2004-07-29 18:38
2004.10.24
Захват видеопотока.


4-1095835762
SkyN
2004-09-22 10:49
2004.10.24
Выводить текст шрифтом, не устанавливая его в системе.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский