Rambler's Top100
"Knowledge itself is power"
F.Bacon
Поиск | Карта сайта | Помощь | О проекте | ТТХ  
 Круглый стол
  
Правила КС
>> Настройки

Фильтр вопросов
>> Новые вопросы
отслеживать по
>> Новые ответы

Избранное

Страница вопросов
Поиск по КС


Специальные проекты:
>> К л ю к в а
>> Г о л о в о л о м к и

Вопрос №

Задать вопрос
Off-topic вопросы

Помощь

 
 К н и г и
 
Книжная полка
 
 
Библиотека
 
  
  
 


Поиск
 
Поиск по КС
Поиск в статьях
Яndex© + Google©
Поиск книг

 
  
Тематический каталог
Все манускрипты

 
  
Карта VCL
ОШИБКИ
Сообщения системы

 
Форумы
 
Круглый стол
Новые вопросы

 
  
Базарная площадь
Городская площадь

 
   
С Л С

 
Летопись
 
Королевские Хроники
Рыцарский Зал
Глас народа!

 
  
ТТХ
Конкурсы
Королевская клюква

 
Разделы
 
Hello, World!
Лицей

Квинтана

 
  
Сокровищница
Подземелье Магов
Подводные камни
Свитки

 
  
Школа ОБЕРОНА

 
  
Арсенальная башня
Фолианты
Полигон

 
  
Книга Песка
Дальние земли

 
  
АРХИВЫ

 
 

Сейчас на сайте присутствуют:
 
  
 
Во Флориде и в Королевстве сейчас  18:42[Войти] | [Зарегистрироваться]
Ответ на вопрос № 52159

21-05-2007 15:19
Добрый день!
возникла проблема с арифметическим округлением SimpleRoundTo(5.055,-2) - получил 5.05 вместо ожидаемого 5.06.
Почитал много вопросов связанных с этой проблемой, нашел статью:
"Загадки округления"
http://www.delphikingdom.com/asp/viewitem.asp?catalogID=1217
в данной статье предлагается функция "DecimalRoundExt" написанная неким "John Herbster", но поиски данного алгоритма так и не увенчались успехом!
Может кто нибудь подскажет где достать этот алгоритм, или "верно работающий" его аналог арифметического округления (того которому обучали в школах)?

Буду очень благодарен!

[+] Добавить в избранные вопросы

Отслеживать ответы на этот вопрос по RSS

Ответы:


Уважаемые авторы вопросов! Большая просьба сообщить о результатах решения проблемы на этой странице.
Иначе, следящие за обсуждением, возможно имеющие аналогичные проблемы, не получают ясного представления об их решении. А авторы ответов не получают обратной связи. Что можно расценивать, как проявление неуважения к отвечающим от автора вопроса.

22-05-2007 02:41 | Сообщение от автора вопроса
Все, разобрались...
сошлись на том что:
5,23495 = 5,23
5,0645 = 5,06
5,06501 = 5,07
5,065 = 5,07

тоесть все что после третего знака от запятой - отбрасываем, и после этого последний знак округляем...
Тоесть так как говорили Уважаемые Geo и Николай Белюченко

А это ПО КАКИМ ПРАВИЛАМ??? А если 5.0644 - 5.06


да, 5.06

22-05-2007 02:27
Если не удастся объяснить заказчику про математику, то придется Вам самому писать функцию округления :-)

Говоришь: "Глянул я, как вы считаете - неправильно абсолютно. Все считают иначе". Если согласятся -  то в счете нужно будет указать "Аудит и консалтинговые услуги". Если нет - "Разработка эксклюзивно-заказного ПО".

;-)

22-05-2007 02:06
>>> 5,0645 до сотых берем только значащую циру после сотых да?
Ну, на практике получается и так. Хотя смысл несколько другой.

Мы хотим округлить число до второго знака после запятой. То есть наше число больше 5,06 и меньше 5,07. Разница в 0,01. Какую цифру ставить? По правилу мы должны смотреть на оставшуюся часть числа: она больше половины диапазона (0,005) или меньше. Если больше либо равна половине, то округляем вверх. Если меньше, то вниз.

В Вшем случае оставшаяся часиь равна 0,0045. А это меньше, чем 0,005. Значит округляем вниз.

>>> просто было число 5,23495 - я округлял как 5,23... но заказчик сказал что правильно будет 5,24...
С точки зрения математики, заказчик не прав. Но с точки зрения правил работы с клиентом, заказчик всегда прав ;-) Если не удастся объяснить заказчику про математику, то придется Вам самому писать функцию округления :-)

22-05-2007 01:58 | Сообщение от автора вопроса
тоесть при округлении числа
5,0645 до сотых берем только значащую циру после сотых да?
тоесть 5,0645 смотрим третий знак, а остальное выкидываем...
получается 5,064 значащая цифра = 4, значит округляем как 5,06...
Странно ну ладна...
просто было число 5,23495 - я округлял как 5,23... но заказчик сказал что правильно будет 5,24...
Совсем запутался, надо открывать школьный учебник за третий клас и идти к заказчику разбирать примерчики! :)


22-05-2007 01:44
>>> Чтото не так делаю? Забыл школьный курс чтоли? :(
Или забыл, или неправильно понял.

5,0645 округляем до второго знака после запятой. Имеется две неточных цифры. Округлять их надо не по отдельности, а вместе.

45 больше 50 (то есть половины) или меньше? Меньше. Значит округление вниз. Ничего не добавляем. Получаем 5,06. Все правильно.

22-05-2007 01:28 | Сообщение от автора вопроса
ну мне надо вот как:
5,0645

последний знак =5
значит убираем, а знаку перед ним прибавляем +1...
получаем
5,065
далее последний знак опять = 5
значит убираем, а знаку перед ним прибавляем +1...
итог:5,07

Чтото не так делаю? Забыл школьный курс чтоли? :(

22-05-2007 01:26 | Сообщение от автора вопроса
2Fisher
спасибо за ссылку, только я не понял! :(
пробую:
DecimalRoundExt(5,065 ,2,drHalfEven) получил:5,06
DecimalRoundExt(5,0545,2,drHalfPos) получил:5,05
DecimalRoundExt(5,055 ,2,drHalfNeg) получил:5,05
DecimalRoundExt(5,055 ,2,drHalfDown) получил:5,05
DecimalRoundExt(5,0545,2,drHalfUp) получил:5,05
DecimalRoundExt(5,055 ,2,drRndNeg) получил:5,05
DecimalRoundExt(5,054 ,2,drRndPos) получил:5,06
DecimalRoundExt(5,055 ,2,drRndDown) получил:5,05
DecimalRoundExt(5,054 ,2,drRndUp) получил:5,06

тоесть и тут неверно!
чтото не так делаю? :(

Придется наверно разложить на строку, и самому сделать как учили в школе! :(

22-05-2007 01:05
Может кто нибудь подскажет где достать этот алгоритм, или "верно работающий" его аналог арифметического округления (того которому обучали в школах)?
зато из 5,0645 получает 5,06... а надо 5,07
В какой школе обучали, что 5,0645 при округлении дает 5,07?

22-05-2007 01:00 | Комментарий к предыдущим ответам
зато из 5,0645 получает 5,06... а надо 5,07 А это ПО КАКИМ ПРАВИЛАМ??? А если 5.0644 - 5.06 ???

22-05-2007 00:58
Не совсем в тему, но как-то не задумывался...Прочитал статью о бухгалтерском округлении...Тихо прибалдел, хотя все логично. Статью не помню, но нашел на форуме.
http://mindmix.ru/accountancy/160-368-okruglenie-pri-raschetah-read.shtml

22-05-2007 00:56 | Сообщение от автора вопроса
По крайней мере 5.055 в 5.06 нормально переводит.
зато из 5,0645 получает 5,06... а надо 5,07
Так что этот метод тоже не подходит..
В моем случае в задаче получаются числа с 6 знаками после запятой, и их надо правильно округлить до сотых...
А это был приведен пример первый попавшийся под руку...
помоему в статье "Загадки округления" - рассматривался этот способ...
И из всех рассмотренных хотелось бы найти способ предоставленный "John Herbster"

22-05-2007 00:51 | Комментарий к предыдущим ответам
Действительно, эта функция показала правильные результаты арифметического округления в моих тестах, использовавшихся в статье. Приобщим к делу ;-)

А ссылка на "John Herbster" есть в обсуждении: http://cc.codegear.com/Item.aspx?id=21909
скачивание после бесплатной регистрации



21-05-2007 22:32
Я думаю проблема в типе Double не знаю почему, но данный тип очень популярен в то время как со процессор работает только с типом Extended (возможно ошибаюсь но кажется это так).
Предлагаю просто функцию SimpleRoundTo перевести на тип Extended

function SimpleRoundTo(const AValue: Extended; const ADigit: TRoundToRange = -2): Extended;
var
  LFactor: Extended;
begin
  LFactor := IntPower(10, ADigit);
  if AValue < 0 then
    Result := Trunc((AValue / LFactor) - 0.5) * LFactor
  else
    Result := Trunc((AValue / LFactor) + 0.5) * LFactor;
end;


По крайней мере 5.055 в 5.06 нормально переводит.

Добавьте свое cообщение

Вашe имя:  [Войти]
Ваш адрес (e-mail):На Королевстве все адреса защищаются от спам-роботов
контрольный вопрос:
Однажды, в студеную зимнюю пору я из лесу вышел, был сильный ЧТО?
в качестве ответа на вопрос или загадку следует давать только одно слово в именительном падеже и именно в такой форме, как оно используется в оригинале.
Надоело отвечать на странные вопросы? Зарегистрируйтесь на сайте.
Тип сообщения:
Текст:
Жирный шрифт  Наклонный шрифт  Подчеркнутый шрифт  Выравнивание по центру  Список  Заголовок  Разделительная линия  Код  Маленький шрифт  Крупный шрифт  Цитирование блока текста  Строчное цитирование
  • вопрос Круглого стола № XXX

  • вопрос № YYY в тесте № XXX Рыцарской Квинтаны

  • сообщение № YYY в теме № XXX Базарной площади
  • обсуждение темы № YYY Базарной площади
  •  
     Правила оформления сообщений на Королевстве

    Страница избранных вопросов Круглого стола.
      
    Время на сайте: GMT минус 5 часов

    Если вы заметили орфографическую ошибку на этой странице, просто выделите ошибку мышью и нажмите Ctrl+Enter.
    Функция может не работать в некоторых версиях броузеров.

    Web hosting for this web site provided by DotNetPark (ASP.NET, SharePoint, MS SQL hosting)  
    Software for IIS, Hyper-V, MS SQL. Tools for Windows server administrators. Server migration utilities  

     
    © При использовании любых материалов «Королевства Delphi» необходимо указывать источник информации. Перепечатка авторских статей возможна только при согласии всех авторов и администрации сайта.
    Все используемые на сайте торговые марки являются собственностью их производителей.

    Яндекс цитирования