Форум: "Основная";
Текущий архив: 2004.06.27;
Скачать: [xml.tar.bz2];
ВнизOкругление Найти похожие ветки
← →
MakNik (2004-06-08 10:08) [0]Подскажите, плз, быстрый алгоритм бухгалтерского округления без использования ф-ции Round.
← →
KSergey © (2004-06-08 10:15) [1]А Round - это медленный? Или как?
Впрочем, его "бухгалтерность" - это еще большой вопрос.
См. статью
http://www.delphikingdom.ru/asp/viewitem.asp?catalogid=374
и
http://www.delphikingdom.ru/asp/viewitem.asp?catalogid=831
← →
Anatoly Podgoretsky © (2004-06-08 10:19) [2]Надо дать определение термину "бухгалтерское" округление и у меня большое подозрение, что разные бухгалтеры по разному округляют, у нас например финансовое ака банковское окгруление.
← →
MakNik (2004-06-08 16:00) [3]
> Anatoly Podgoretsky © (08.06.04 10:19) [2]
... а можно алгоритм финансового округления?
← →
MakNik (2004-06-08 16:01) [4]Удалено модератором
← →
Weber © (2004-06-08 16:56) [5]
> MakNik (08.06.04 16:01) [4]
Формат представления Real (= Double) в двоичном виде знаете?
← →
Anatoly Podgoretsky © (2004-06-08 17:02) [6]половина округляется до четного
← →
MakNik (2004-06-09 12:12) [7]...а реализацию без использования ф-ции Round можно?
← →
Anatoly Podgoretsky © (2004-06-09 12:23) [8]MakNik (09.06.04 12:12) [7]
А зачем, есть сомнение, что она будет эффективнее Юорландовской
← →
MakNik (2004-06-09 12:53) [9]... ф-ция Round на разных компах отрабатывает по разному... например: 18.5 на разных компах округляется либо как 19.0 либо как 18.0 ...
← →
Anatoly Podgoretsky © (2004-06-09 12:56) [10]Так и тебя тоже самое будет, есть некоторые программы/модули которые меняют контрольное слово процессора, потом, а ты уверен, что число именно 18,5 а не скажем 18,5000000000000001
← →
MakNik (2004-06-09 13:10) [11]... число точно 18.5... а вот что касается контрольного слова процессора, то, судя по всему, дело в нем... меняя тип округления на округление вверх или вниз - все работает, а вот округление к четному - нет...
← →
Anatoly Podgoretsky © (2004-06-09 13:32) [12]MakNik (09.06.04 13:10) [11]
Проверять число надо в отладчике, как extended
← →
MakNik (2004-06-09 13:43) [13]... но даже если число и 18,5000000000000001, то почему оно по разному округляется на разных компах?
← →
evvcom © (2004-06-09 13:49) [14]18,5000000000000001 и 18,5 ровно должны округляться до 19,0. А вот 18,49999999999999999 до 18,0.
← →
Anatoly Podgoretsky © (2004-06-09 13:54) [15]evvcom © (09.06.04 13:49) [14]
Ты сам это решил, а вот остальной мир и функция Round имеют другое мнение.
← →
evvcom © (2004-06-09 14:29) [16]Это не я решил, это правила элементарной математики. Соглашусь с тем, что насколько точно число не представлялось (даже в Extended), оно не всегда точно равно 18,5, хотя и отображается как 18,500000000000, поэтому и округляется в Round когда в одну, а когда в другую сторону.
Хотя иногда я еще подобные вещи списываю на ошибки в Дельфях. Например, я писал dll для сторонней проги. Вызывается функция dll, обрабатывает данные и в некоторых случаях сообщает об ошибках через MessageDlg или ShowMessage. Этот код замечательно работал, когда был откомпилен в D5. Но потом после некоторого тестирования D7 я перешел на него. Но после вызова MessageDlg или ShowMessage вылетала ошибка деления на нуль. Прошагав по этим функциям, я выяснил, что вылетает именно на вызовах функций, работающих с числами с плавающей запятой Round и Trunc. Сравнив случаи ошибочные с неошибочными, увидел разницу в контрольных словах. Далее перед вызовом диалога в отладчике исправлял контрольное слово, после этого диалог показывался без ошибки. Что это, если не ошибка Борланда?
← →
Григорьев Антон © (2004-06-09 14:35) [17]Округление числа X по математическим правилам - Trunc(X+0.5)
← →
MakNik (2004-06-09 18:04) [18]... а алгоритм округляется до четного без использования ф-ции Round можете подсказать?
← →
Fay © (2004-06-09 18:23) [19]2MakNik (09.06.04 18:04) [18]
Это делает сопр. Вам точно нужно этого избежать?
← →
MakNik (2004-06-11 12:37) [20]
> Fay © (09.06.04 18:23) [19]
ДА! Мне нужно обеспечить одинаковый расчет не зависимо от сопроцессора
← →
Anatoly Podgoretsky © (2004-06-11 12:56) [21]18,500000000000 это не Extended а Double - 15 символов, для отображения надо использовать другую функцию преобразования, которая покажет 18-20 символов. В отладчике можно увидеть точное значение числа, если явно указать формать отображения.
← →
Виталя © (2004-06-11 12:57) [22]Вопрос в том с какими числами ты будешь работать - если ты заведомо знаешь, что тебя будут интересовать не более 6 символов после зпт., а округляешь до 2-х -
берешь 6-й символ - и если он >4 -> уменьшаешь 5-й на 1,
дальше рассматр. до 5 - го символа -
берешь 5-й символ - и если он >4 -> уменьшаешь 4-й на 1,
и т.д. пока не получишь 2 знака после зпт.
так как работаешь с int - сопроцессору все равно.
← →
Anatoly Podgoretsky © (2004-06-11 13:17) [23]Что бы не было ошибок округления, надо работать с фиксированой запятой.
← →
Mim1 © (2004-06-11 19:52) [24]
> А вот 18,49999999999999999 до 18,0.
Кажется надо округлять до 19.
← →
Anatoly Podgoretsky © (2004-06-11 20:00) [25]Mim1 © (11.06.04 19:52) [24]
С какой стати? Вот если бы было ровно посредине то можно бы было согласиться. Есть конечно округление и в меньшую и в большию стороны, но это такая редкость,
в основном когда меньше ,5 то в меньшую
если больше то в большую
если ровно ,5 то или к близайшему четнуму, нечетному или в большую.
← →
evvcom © (2004-06-13 01:28) [26]
> если ровно ,5 то или к близайшему четнуму, нечетному или
> в большую.
По правилам элементарной математики округляется в большую сторону и никаких вольностей с "или".
← →
Anatoly Podgoretsky © (2004-06-13 01:41) [27]Не элементарной, а щкольной, российского производства.
← →
evvcom © (2004-06-13 01:51) [28]Пусть будет так, но если, Анатолий, у Вас имеется линк на труд, в котором зафиксированы иные правила округления, пусть даже забугорного производства, уж не пожалейте.
← →
Anatoly Podgoretsky © (2004-06-13 13:42) [29]F1 + Round function
If X is exactly halfway between two whole numbers, the result is always the even number.
Лругие правила округления можешь поискать в Интернете
← →
evvcom © (2004-06-13 15:50) [30]This method of rounding is often called "Banker’s Rounding".
Ну что ж, приношу свои извинения, если что не так. До этого примечания я никогда не дочитывал, потому что даже не думал, что правила округления, которые преподали нам в школе, могут быть столь не очевидны.
← →
Anatoly Podgoretsky © (2004-06-13 15:52) [31]На самом деле правил гораздо больше
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.06.27;
Скачать: [xml.tar.bz2];
Память: 0.52 MB
Время: 0.041 c