powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / (SOS!!!!) Проблема с округлением
14 сообщений из 14, страница 1 из 1
(SOS!!!!) Проблема с округлением
    #33476066
Delphi_7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем привет!
Подскажите нужно очень срочно:
Пр: Есть число 124.125 => хочу округлить до 2-х значащих цифр после запятой
Ф-я RoundTo(124.125, -2) дает 124.12
Аналогично RoundTo(124.135, -2) дает 124.13

т.е. 5 всегда округляет в меньшую сторону.


Подскажите как сделать чтобы пятерка округляла в большую сторону
...
Рейтинг: 0 / 0
(SOS!!!!) Проблема с округлением
    #33476072
DimaBr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
showMessage(FloatToStr(RoundTo(124.135, -2)));

Ответ 124,14
...
Рейтинг: 0 / 0
(SOS!!!!) Проблема с округлением
    #33476099
Delphi_7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мне надо избавится от правила "пятерки", т.е. как сделать чтобы к примеру
...
Рейтинг: 0 / 0
(SOS!!!!) Проблема с округлением
    #33476106
Delphi_7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
124.125 давал 124.13
124.135 давал 124.14
...
Рейтинг: 0 / 0
(SOS!!!!) Проблема с округлением
    #33476117
Фотография Castor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
используйте SimpleRoundTo вместо RoundTo
...
Рейтинг: 0 / 0
(SOS!!!!) Проблема с округлением
    #33476134
Delphi_7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
var vS1, vS2, vS3: double;
vStr: string;
begin
vS1 := 124.125;
vS2 := SimpleRoundTo(vS1, -2);
vS3 := RoundTo(vS1, -2);
showMessage(FloatToStr(vS2));
showMessage(FloatToStr(vS3));
Одинаковый результат : 124.12 ((
...
Рейтинг: 0 / 0
(SOS!!!!) Проблема с округлением
    #33476157
Фотография Castor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Delphi_7var vS1, vS2, vS3: double;
vStr: string;
begin
vS1 := 124.125;
vS2 := SimpleRoundTo(vS1, -2);
vS3 := RoundTo(vS1, -2);
showMessage(FloatToStr(vS2));
showMessage(FloatToStr(vS3));
Одинаковый результат : 124.12 ((
может где-то раньше в программе SetRoundMode(rmNearest) встречается?
...
Рейтинг: 0 / 0
(SOS!!!!) Проблема с округлением
    #33476167
Фотография Castor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Castor Delphi_7var vS1, vS2, vS3: double;
vStr: string;
begin
vS1 := 124.125;
vS2 := SimpleRoundTo(vS1, -2);
vS3 := RoundTo(vS1, -2);
showMessage(FloatToStr(vS2));
showMessage(FloatToStr(vS3));
Одинаковый результат : 124.12 ((
может где-то раньше в программе SetRoundMode(rmNearest) встречается?
хотя это бы влияло только на RoundTo , но не на SimpleRoundTo
...
Рейтинг: 0 / 0
(SOS!!!!) Проблема с округлением
    #33476189
Delphi_7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо! Вылетело из головычто есть SetRoundMode
...
Рейтинг: 0 / 0
(SOS!!!!) Проблема с округлением
    #33476217
Фотография Castor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Delphi_7Спасибо! Вылетело из головычто есть SetRoundMode
получилось? Изменение с помощью SetRoundMode - не есть решение проблемы. Все будет округляться в одну сторону. Как показал поиск, на некоторых на компах (не знаю - может это какие-то системные настройки влияют) округление всегда идет неверно. Спасает только написание собственной функции
...
Рейтинг: 0 / 0
(SOS!!!!) Проблема с округлением
    #33476343
Vladimir Kovalevskii
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Castor Delphi_7Спасибо! Вылетело из головычто есть SetRoundMode
получилось? Изменение с помощью SetRoundMode - не есть решение проблемы. Все будет округляться в одну сторону. Как показал поиск, на некоторых на компах (не знаю - может это какие-то системные настройки влияют) округление всегда идет неверно. Спасает только написание собственной функции

полностью согласен. проблема с округлением идёт от св-в FPU.
а именно

Set8087CW(HEX_VALUE);

устанавливает ControlWord FPU,

при вызове инструкции FISTP, CW влияет на то, как в типе FLOAT дробная часть будет отделена от целой. А именно, насколько я понимаю со смещением влево, вправо, или без смещения. Отсюда и выводы ... что легче сделать так:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
  function  RoundToEx( const  AValue: Double;  const  ADigit: integer = - 2 ): double;
 var 
  s:  string ;
  st: Int64;
  sf: real;
 begin 
  s:=floattostr(AValue * IntPower( 10 , -ADigit));
  st:=trunc(strtofloat(s));
  sf:=Frac(strtofloat(s));
   if  sf< 0 . 5   then  result:=st*IntPower( 10 , ADigit);
   if  sf>= 0 . 5   then  result:=(st+ 1 )*IntPower( 10 , ADigit);
 end ;
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
(SOS!!!!) Проблема с округлением
    #39733332
Valart
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
С функцией Round SetRoundMode работает корректно.
Вот, может кому пригодится...

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
//округление до кратного заданному значению числа выбранным методом
function RoundToEx(Value, Precision: Currency; Method: Integer): Currency;
begin
  case Method of
    2: SetRoundMode(rmDown); //в меньшую сторону
    3: SetRoundMode(rmUp); //в большую сторону
  else
    SetRoundMode(rmNearest); //математически
  end;

  if Precision > 0 then
    Result := Round(Value / Precision) * Precision
  else
    Result := Value
end;
...
Рейтинг: 0 / 0
(SOS!!!!) Проблема с округлением
    #39733434
Фотография Кроик Семён
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
из-за использования SetRoundMod эту функцию RoundToEx нельзя применять в многопоточных приложениях
и, кстати, при её завершении хорошим тоном было бы вернуть RoundMod на старое значение
...
Рейтинг: 0 / 0
(SOS!!!!) Проблема с округлением
    #39733629
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
15.11.2018 12:35, Кроик Семён пишет:
> из-за использования SetRoundMod эту функцию RoundToEx нельзя применять в многопоточных приложениях

у тебя каждый поток округляет по-своему?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / (SOS!!!!) Проблема с округлением
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]