Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Программа и интерфейс
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 14.02.2010, 18:14
Аватар для syber
syber syber вне форума
Прохожий
 
Регистрация: 14.02.2010
Сообщения: 13
Репутация: 10
Лампочка Округление

Привет всем. Сразу оговорюсь, что я не супер-пупер программист, программирование - моё хобби и иногда кодирую простые программки. Поэтому, не относитесь сильно предвзято к моему коду.
У меня возникла задача округления чисел до сотых. Например:
32,325 мне нужно округлить до 32,33. 32,324 до 32,32. Т.е. произвести округление по математическим правилам. Функция RoundTo округляет 32,325 как 32,32. Меня это не устраивает. Расчеты финансовые и копейками пренебрегать не могу. Написал такую функцию под delphi 7.
Код:
function Okruglenie(x:real):real;
var
x1, x2, x3 : real;
begin
x1 := Frac(x);
x2 := x1*100;
x3 := Frac(x2);
if x3 >= 0.5 then x2 := x2 + 1 else x2 := x2;
if x2 >= 100 then x := Int(x)+1 else x := Int(x) + (Trunc(x2)/100);
Okruglenie := x;
end;

В результате у меня получается из числа 32,325 число 32,32. Но ведь по коду должно получиться 32.33

Решил эту проблему так:
Код:
if x3 >0.49999999999 then x2 := x2 + 1 else x2 := x2;

подскажите более деликатный способ решения этой проблемы
Ответить с цитированием
  #2  
Старый 14.02.2010, 18:17
Аватар для Aristarh Dark
Aristarh Dark Aristarh Dark вне форума
Модератор
 
Регистрация: 07.10.2005
Адрес: Москва
Сообщения: 2,906
Версия Delphi: Delphi XE
Репутация: выкл
По умолчанию

SimpleRoundTo, спасет гиганта мысли
__________________
Некоторые программисты настолько ленивы, что сразу пишут рабочий код.

Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты.
Ответить с цитированием
  #3  
Старый 14.02.2010, 18:23
Аватар для syber
syber syber вне форума
Прохожий
 
Регистрация: 14.02.2010
Сообщения: 13
Репутация: 10
По умолчанию

Спасибо, хотел было обрадоваться, но все-равно округляет нечестно, например 32,995 округляет как 32,99. А должно давать 33.
Ответить с цитированием
  #4  
Старый 14.02.2010, 19:06
Аватар для syber
syber syber вне форума
Прохожий
 
Регистрация: 14.02.2010
Сообщения: 13
Репутация: 10
По умолчанию

Модератор, приношу свои извинения. Функция SimpleRoundTo округляет точно по банковским правилам (а мне оно как раз и нужно).
Цитата:
банковское округление, (если отбрасываемые цифры больше 0.5, происходит округление вверх (от нуля), если меньше 0.5 - цифры отбрасываются, если отбрасываемая часть равна 0.5, то округление происходит в зависимости от четности предпоследней цифры),

Мои правила округления не соответствуют этим правилам. Большое спасибо за совет.
Ответить с цитированием
  #5  
Старый 14.02.2010, 19:17
Аватар для syber
syber syber вне форума
Прохожий
 
Регистрация: 14.02.2010
Сообщения: 13
Репутация: 10
По умолчанию

Хотя, все-равно считает с ошибками
Ответить с цитированием
  #6  
Старый 14.02.2010, 19:30
Аватар для Ultras
Ultras Ultras вне форума
Начинающий
 
Регистрация: 09.02.2010
Адрес: Россия / Ставрополь
Сообщения: 138
Репутация: 475
По умолчанию

Цитата:
Сообщение от syber
Хотя, все-равно считает с ошибками
проверил щас, 32.325 округляет до 32.33, 32.324 округляет до 32.32 (проверял именно Вашу функцию), если есть вопросы, можете написать по ICQ 418018483
Ответить с цитированием
  #7  
Старый 14.02.2010, 20:02
Аватар для s0Creator
s0Creator s0Creator вне форума
Местный
 
Регистрация: 20.02.2008
Адрес: Московская область
Сообщения: 420
Репутация: 884
По умолчанию

Цитата:
Сообщение от syber
Модератор, приношу свои извинения. Функция SimpleRoundTo округляет точно по банковским правилам (а мне оно как раз и нужно).
Мои правила округления не соответствуют этим правилам. Большое спасибо за совет.
Тогда объясните свои правила.
Ответить с цитированием
  #8  
Старый 14.02.2010, 20:08
Аватар для syber
syber syber вне форума
Прохожий
 
Регистрация: 14.02.2010
Сообщения: 13
Репутация: 10
По умолчанию

Цитата:
Сообщение от s0Creator
Тогда объясните свои правила.
Арифметическое округление. Т.е. 32,995 должно округляться как 33.00, а 32,324 как 32,32
Ответить с цитированием
  #9  
Старый 14.02.2010, 20:14
Аватар для syber
syber syber вне форума
Прохожий
 
Регистрация: 14.02.2010
Сообщения: 13
Репутация: 10
По умолчанию

На другом форуме нашёл сообщение, что функции RoundTo и SimpleRoundTo в частных случаях выдают ошибки.
Ответить с цитированием
  #10  
Старый 14.02.2010, 20:21
Аватар для syber
syber syber вне форума
Прохожий
 
Регистрация: 14.02.2010
Сообщения: 13
Репутация: 10
По умолчанию

Цитата:
Сообщение от Ultras
проверил щас, 32.325 округляет до 32.33, 32.324 округляет до 32.32 (проверял именно Вашу функцию), если есть вопросы, можете написать по ICQ 418018483

27.325 у меня округляется как 27.32. Это точно. Ввод данных через компонент Edit
Такой результат дает и SimpleRoundTo и вариант функции с 0,5. Хотя, по логике (проверял с листочком) должно выдавать 27.33

Последний раз редактировалось syber, 14.02.2010 в 20:24.
Ответить с цитированием
  #11  
Старый 14.02.2010, 20:32
Аватар для s0Creator
s0Creator s0Creator вне форума
Местный
 
Регистрация: 20.02.2008
Адрес: Московская область
Сообщения: 420
Репутация: 884
По умолчанию

Еще раз - Вы можете сказать правила по каким Вам надо округлять?
Например Вы привели правила :
Цитата:
банковское округление, (если отбрасываемые цифры больше 0.5, происходит округление вверх (от нуля), если меньше 0.5 - цифры отбрасываются, если отбрасываемая часть равна 0.5, то округление происходит в зависимости от четности предпоследней цифры),
и сказали что у Вас по другому.
Попробуйте сформулировать также четко.
Ответить с цитированием
  #12  
Старый 14.02.2010, 20:32
Аватар для syber
syber syber вне форума
Прохожий
 
Регистрация: 14.02.2010
Сообщения: 13
Репутация: 10
По умолчанию

Все числа - денежные суммы.

Правило округления у меня должно быть таким:

суммы до 0,499 копейки округляются до 0 копеек, а суммы от 0,500 до 0,999 копейки округляются до 1 копейки

Т.е. 27,325 должно округляться как 27,33, а 27,32499 как 27,32 SimpleRoundTo в данном примере точно выводит 27,32 Ввожу числа через компонент Edit, преобразование через функцию StrToFloat

Последний раз редактировалось syber, 14.02.2010 в 20:37.
Ответить с цитированием
  #13  
Старый 14.02.2010, 20:44
Аватар для s0Creator
s0Creator s0Creator вне форума
Местный
 
Регистрация: 20.02.2008
Адрес: Московская область
Сообщения: 420
Репутация: 884
По умолчанию

Прошу прощения - не заметил.
Сейчас найду арифметическое округление.
Но есть нюанс. Есть точность при переводе десятичные - двоичные.
Где то встречал.
Попробую найти как решается. ( но не сегодня )
Ответить с цитированием
  #14  
Старый 14.02.2010, 20:47
Аватар для syber
syber syber вне форума
Прохожий
 
Регистрация: 14.02.2010
Сообщения: 13
Репутация: 10
По умолчанию

Большое спасибо за беспокойство и проявленное внимание.
Ответить с цитированием
  #15  
Старый 14.02.2010, 20:57
Аватар для s0Creator
s0Creator s0Creator вне форума
Местный
 
Регистрация: 20.02.2008
Адрес: Московская область
Сообщения: 420
Репутация: 884
По умолчанию

Так проблема решена или покопаться в архивах?
Кстати как на счет типа Currency ?
Ответить с цитированием
Ответ


Delphi Sources

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

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 11:06.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter