Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Корректное округление чисел

Delphi , Синтаксис , Математика

Корректное округление чисел

Оформил: DeeCo
Автор: http://www.swissdelphicenter.ch

{ 
  The function Round of the Delphi doesn't work 
  like it is usually expected. 
  The odd numbera are rounded down and the even numbers up. 

  Die Round Funktion in Delphi gibt normalerweise nicht 
  die erwartete Zahl zurьck. 
  Die ungeraden Zahlen werden abgerundet, die geraden aufgerundet 

  Example/ Beispiel: 

  x:= Round(17.5) = x = 18 

  x:= Round(12.5) = x = 12 
}

 function DoRound(const X: Extended): Int64;
 begin
   Result := 0;
   if X0 then
     Result := trunc(X + 0.5);
   if Xthen
     Result := trunc(X - 0.5);
 end;


 procedure TForm1.Button1Click(Sender: TObject);
 begin
   ShowMessage(FormatFloat('0.00', DoRound(17.5)));  // - 18 
  ShowMessage(FormatFloat('0.00', DoRound(12.5)));  // - 13 

  //This rounds every value to 0.05 steps 
  //Rundet in 0.05 Schritten 
  ShowMessage(FormatFloat('0.00', Round(17.22 / 0.05) * 0.05)); // - 17.20 
end;


 {***Another function:***}

 function RoundUp(Value: Extended): Int64;
   procedure Set8087CW(NewCW: Word);
   asm
          MOV     Default8087CW,AX
          FNCLEX
          FLDCW   Default8087CW
  end;
 const
   RoundUpCW = $1B32;
 var
   OldCW: Word;
 begin
   OldCW := Default8087CW;
   try
     Set8087CW(RoundUpCW);
     Result := Round(Value);
   finally
     Set8087CW(OldCW);
   end;
 end;

 procedure TForm1.Button2Click(Sender: TObject);
 begin
   ShowMessage(FormatFloat('0.00', RoundUp(19.32)));  // - 19 
end;

Программа на языке Delphi, которая стремится исправить стандартное поведение округления функции Round, которое округляет нечетные числа вниз и четные числа вверх. Автор создал две функции, DoRound и RoundUp, чтобы достичь этого.

Функция DoRound принимает вещественное число с плавающей запятой в виде входного параметра и возвращает целочисленное значение, округленное до ближайшего целого числа с половинными значениями, округленными от нуля (т.е., к ближайшему четному числу). Эта функция использует простой алгоритм: если входное значение меньше 0,5, оно округляется вниз; иначе, оно округляется вверх.

Функция RoundUp также принимает вещественное число с плавающей запятой в виде входного параметра и возвращает целочисленное значение, округленное вверх до ближайшего целого числа. Для достижения этого она временно изменяет контрольную слово (CW) 8087- floating-point coprocessor с помощью inline-ассемблерного кода, устанавливает CW в конкретное значение, которое позволяет округлять вверх, и затем вызывает функцию Round.

Программа включает два процедура, Button1Click и Button2Click, которые демонстрируют использование этих функций. В Button1Click она использует функцию DoRound для округления 17,5 и 12,5 до ближайших целых чисел и отображает результаты в сообщениях об ошибках. В Button2Click она использует функцию RoundUp для округления 19,32 до ближайшего целого числа.

Вот некоторые предложения по улучшению кода:

  1. Код может быть улучшен с помощью более подробных комментариев, объясняющих цель каждого раздела, переменной и функции.
  2. Переменные должны иметь более описательные имена и следовать согласованному конвенции именования (например, roundUpValue вместо только Value).
  3. Вместо использования inline-ассемблерного кода в функции RoundUp, можно использовать встроенные функции математических операций с плавающей запятой Delphi или третьепартийные библиотеки, которые предоставляют возможности округления вверх.
  4. Программа может включать больше тестовых случаев для обеспечения корректной работы функций DoRound и RoundUp для различных входных значений.

В целом, предоставленный код - это хороший старт в решении проблемы стандартного округления в Delphi. Однако он может быть улучшен с помощью лучших практик программирования, комментирования и тестирования.

Корректное округление чисел в Delphi: описано функцию DoRound, которая корректирует округление чисел, а также предлагается альтернативный способ rounding с использованием функции RoundUp.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Математика ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-01-28 07:13:28/0.013576984405518/1