Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.06.27;
Скачать: CL | DM;

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.54 MB
Время: 0.024 c
14-1086286974
Потеряв однажды ник
2004-06-03 22:22
2004.06.27
Сколько вам лет


14-1086155132
Piter
2004-06-02 09:45
2004.06.27
Обет молчания


3-1085853107
Yakudza
2004-05-29 21:51
2004.06.27
ADOCommand


1-1087305759
Maxim
2004-06-15 17:22
2004.06.27
DLL


1-1087069935
oleg_SYS
2004-06-12 23:52
2004.06.27
Пункт "создать"