Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2005.03.13;
Скачать: [xml.tar.bz2];

Вниз

Округление чисел в 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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 0.031 c
14-1109146008
}|{yk
2005-02-23 11:06
2005.03.13
Тестирование ПО


1-1109667568
Serge_2
2005-03-01 11:59
2005.03.13
StatusBar - прорисовка


14-1108713903
07BB:080Dh
2005-02-18 11:05
2005.03.13
Пить или не пить. за и против ?


3-1108387216
Polad
2005-02-14 16:20
2005.03.13
Interbase + Loockup =?


4-1106922512
Aleksandr.
2005-01-28 17:28
2005.03.13
Кто ждет результата SendMessage с WM_CopyData?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский