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

Вниз

Округление чисел в Delphi   Найти похожие ветки 

 
АМБ   (2005-03-01 13:40) [0]

Подскажите как организовать округление чисел с заданой точностью в Delphi. Я сделал свою функцию основанную на round. Но у нее обнаружилась странная особенность.
Round(1.5) = 2, а Round(2.5)=2, тоже. Т.е. только 1.5 округляет до 2, а что больше (2.5, 3.5, и т.д.) округляет в меньшую сторону. Как сделать, чтобы округление 0.5 всегда шло в большую сторону.


 
Думкин ©   (2005-03-01 13:44) [1]

> Round(1.5) = 2, а Round(2.5)=2, тоже. Т.е. только 1.5 округляет
> до 2, а что больше (2.5, 3.5, и т.д.) округляет в меньшую
> сторону.

Не верно.

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".


 
MU   (2005-03-01 13:45) [2]

SimpleRoundTo


 
Думкин ©   (2005-03-01 13:45) [3]

> Подскажите как организовать округление чисел с заданой точностью в Delphi.

А это RoundTo + F1


 
АМБ   (2005-03-01 13:47) [4]


> Думкин ©   (01.03.05 13:44) [1]


> Не верно.


Что не верно? Поясните.


 
АМБ   (2005-03-01 13:57) [5]

SimpleRoundTo(4.145, -2) = 4.14
и
RoundTo(4.145, -2) = 4.14
т.е. 5 округляется в меньшую сторону, а как сделать, чтобы 5 округлялась в большую сторону?


 
Думкин ©   (2005-03-01 14:20) [6]

> [4] АМБ   (01.03.05 13:47)
> Что не верно? Поясните.


а что больше (2.5, 3.5, и т.д.) округляет в меньшую сторону.

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".

Доступно?


 
MU   (2005-03-01 14:32) [7]

есть у меня такая ТУПАЯ и НЕКРАСИВАЯ функция, но она удовлетворила всем нашим требованиям.

function SRoundTo(const AValue: Extended; const ADigit: TRoundToRange = -2): Extended;
var wS : String;
   V : Extended;
   i, P, PGreat, S : Integer;
begin
 S := Sign(AValue);
 V := Abs(AValue);
 wS := FormatFloat("0.0000#", V);
 P := Pos(".", wS) - ADigit;
 PGreat := P;
 if (P + 1 <= Length(wS)) and (P > 1) then
   if ws[P+1] > "4" then
     repeat
       if ws[P] = "." then
         Dec(P);
       while ws[P] = "9" do
       begin
         wS[P] := "0";
         if P = 1 then
           wS := "0" + wS
         else
           Dec(P);
         if ws[P] = "." then
           Dec(P);
       end;
       if ws[P] <> "." then
       begin
         wS[P] := Succ(wS[P]);
         Break;
       end;
     until true;
 for i := PGreat + 1 to Length(wS) do
   if wS[i] <> "." then ws[i] := "0";
 Result := S * StrToFloat(wS);
end;


 
begin...end ©   (2005-03-01 14:52) [8]

> АМБ   (01.03.05 13:57) [5]
> а как сделать, чтобы 5 округлялась в большую сторону?

См. в справке описание функции SetRoundMode.


 
АМБ   (2005-03-01 15:11) [9]


> begin...end ©   (01.03.05 14:52) [8]


Устанавливаю:  SetRoundMode(rmUp);
После этого программа выдает:
Round(17.345) = 17.36
???


 
begin...end ©   (2005-03-01 15:15) [10]

> АМБ   (01.03.05 15:11) [9]

Round возвращает целое число.


 
MU   (2005-03-01 15:15) [11]

попробуй [7]  :)


 
АМБ   (2005-03-01 15:17) [12]


> begin...end ©   (01.03.05 15:15) [10]

Прошу прощения. Не правильно записал. Надо
round(1734.5) = 1736
а потом я еще и делю на коэфициент.


 
begin...end ©   (2005-03-01 15:28) [13]

> АМБ   (01.03.05 15:17) [12]

А надо 1735? Используйте RoundTo(1734.5, 0).


 
АМБ   (2005-03-01 16:29) [14]

Всем спасибо.
В результате получилось
MyFankRound := (SimpleRoundTo(N*R, 0))/R;
где N - округляемое число;
   R - указатель точности округления. Правда не много не удобное. Если указываешь точность после запятой, то указываешь в целых величинах. Например, для точности до десятых, указываешь 10, до сотых - 100. А если надо округлять до целых десятков, то указываешь 0.1, до сотых - 0.01
Еще раз всем спасибо.


 
Sancho ©   (2005-03-01 16:35) [15]

Я прочитал эту ветку попробовал RoundTo(1734.5, 0) = 1735, а вот RoundTo(123.125, -2) = 123.12. Так как в Delphi правильно округлить до, к примеру, 2-х знаков после запятой ? Кстати вот так работает правильно FormatFloat("0.00", 123.125), но это же строки.


 
Antonn ©   (2005-03-01 17:06) [16]

Sancho ©   (01.03.05 16:35) [15]
как вариант: умножать на 100, округлять, делить на 100, удалять знаки в дробной части(если больше 2х)


 
mike-d ©   (2005-03-01 17:43) [17]

Since Delphi"s Round() function uses "bankers rounding" where the value is rounded to the nearest even number, how can I round a floating point number using the more  traditional means, where fractional values less than .5 round down, and fractional values of .5 and greater round up?

Answer:

The following function demonstrates rounding down numbers with  fractional values of less than .5, and rounding up numbers with  fractional values of .5 and greater.

Example:

function RoundUp(X: Extended): Extended;
begin
  Result := Trunc(X) + Trunc (Frac(X) * 2);
end;


http://www.ibase.ru/devinfo/round.htm - полное обсуждение...



Страницы: 1 вся ветка

Текущий архив: 2005.03.13;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.04 c
14-1108800748
_lam
2005-02-19 11:12
2005.03.13
vcl.h


14-1108990234
Calm
2005-02-21 15:50
2005.03.13
Использует ли кто-нибудь вас UML ?


1-1109579928
DK
2005-02-28 11:38
2005.03.13
Plugins


3-1108442952
Tigerr
2005-02-15 07:49
2005.03.13
Удаление записи из БД


14-1109005883
Дмитрий В. Белькевич
2005-02-21 20:11
2005.03.13
read_port_buffer_ulong