Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.12.2017, 14:16   #1
KBO
Форумчанин
 
Регистрация: 11.06.2010
Сообщений: 525
По умолчанию Функция МАТЕМАТИЧЕСКОГО округления. Есть ли проще?

Доброе время суток
Полазив по просторам инета, нашел подходящую функцию которая делает МАТЕМАТИЧЕСКОЕ округление числа.
Чуть доработав ее до округления отрицательных чисел.

Код:
function MathRound(AValue: double; 
          APrecision: integer): double; 
var 
  db, db1, db2: double; 
  i: int64; 
  ii, ink, i1, LTypeNumber: integer; 
begin 
  begin
    if AValue < 0 then
      LTypeNumber := 0
    else LTypeNumber := 1;
    AValue := Abs(AValue);
  end;

  db := AValue-int(AValue); 
  ink := 1; 
  for ii := 1 to APrecision 
    do ink := ink*10; 
  db1 := db*ink; 
  db2 := AValue*ink*100; 
  i := trunc(int(db2)/100); 
  i1 := trunc(db2-i*100); 
  if i1 > 49 then 
    inc(i); 
  if LTypeNumber = 0 then
    result := -1*(i/ink)
  else result := i/ink;
end;
Возможно есть более простое решение…
Выдающее следующий результат (округление например до тысячных):

Код:
3,6145 = 3,615
3,6045 = 3,615
4,6445 = 4,645
Все другие стандартные функции рассчитаны на банковское округление – мне не подходит.
Например если взять "SimpleRoundTo(4.6445, -3)" то это будет = 4.644
KBO вне форума Ответить с цитированием
Старый 04.12.2017, 14:19   #2
Sciv
Старожил
 
Аватар для Sciv
 
Регистрация: 16.05.2012
Сообщений: 3,211
По умолчанию

Если вы имеете в виду просто Round, то она существует со времён паскаля (когда он ещё даже не турбо был)

Также, как и Trunc.

UPDATE

Не пинайте меня, я уже понял всю глубину моего морального падения и невнимательности Был неправ, извините
Начал решать проблему с помощью регулярных выражений. Теперь решаю две проблемы...

Последний раз редактировалось Sciv; 04.12.2017 в 14:23.
Sciv вне форума Ответить с цитированием
Старый 04.12.2017, 14:37   #3
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,656
По умолчанию



Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 04.12.2017, 14:42   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Код:
StrToFloat(FloatToStr(число,ffFixed,15,2))
можно еще поискать открытый исходник функции DecimalRoundExt, по слухам нормально округляет
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 04.12.2017, 15:03   #5
KBO
Форумчанин
 
Регистрация: 11.06.2010
Сообщений: 525
По умолчанию

Цитата:
Сообщение от min@y™ Посмотреть сообщение
Я говорил о МАТЕМАТИЧЕСКОМ округлении

Код:
showmessage(FloatToStr(RoundTo(2.3145, -3)));
= 2,314
блин, только ща заметил, и код что я нашел - "маху" дал

Последний раз редактировалось KBO; 04.12.2017 в 15:19.
KBO вне форума Ответить с цитированием
Старый 04.12.2017, 15:34   #6
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

В коде #4 конечно FloatToStrF а не FloatToStr
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 04.12.2017, 15:41   #7
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,656
По умолчанию

Цитата:
Сообщение от KBO Посмотреть сообщение
Я говорил о МАТЕМАТИЧЕСКОМ округлении
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...

Последний раз редактировалось min@y™; 04.12.2017 в 15:57.
min@y™ вне форума Ответить с цитированием
Старый 04.12.2017, 16:04   #8
KBO
Форумчанин
 
Регистрация: 11.06.2010
Сообщений: 525
По умолчанию

Цитата:
Сообщение от min@y™ Посмотреть сообщение
Ну конечно влияет последняя цифра (эта последняя цифра настраивает прибор), без нее не было бы этой темы... На которой уже очень много людей накололось

Последний раз редактировалось KBO; 04.12.2017 в 16:06.
KBO вне форума Ответить с цитированием
Старый 04.12.2017, 16:09   #9
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,656
По умолчанию

Цитата:
Сообщение от KBO Посмотреть сообщение
Ну конечно влияет последняя цифра (эта последняя цифра настраивает прибор), без нее не было бы этой темы... На которой уже очень много людей накололось
Да я про погрешность, блин, при переводе dec ---> bin ---> dec.
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 04.12.2017, 16:23   #10
KBO
Форумчанин
 
Регистрация: 11.06.2010
Сообщений: 525
По умолчанию

Цитата:
Сообщение от min@y™ Посмотреть сообщение
Да я про погрешность, блин, при переводе dec ---> bin ---> dec.
Главное чтоб округление было математическим (последняя цифра)... (там посмотрим, но не думаю)
KBO вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
вычислить значение математического выражения, Функция (Delphi) demopp Помощь студентам 0 19.09.2012 23:54
Неправильно работает функция округления числа Nomicos Помощь студентам 3 09.07.2012 16:23
Функция округления в большую сторону в c++ Karina89 Помощь студентам 1 23.11.2011 18:02
Функция округления Алена-2009 Microsoft Office Excel 2 07.05.2010 14:13
функция округления artemavd Общие вопросы Delphi 10 28.07.2008 19:36