Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.03 c
1-1087080928
Torus
2004-06-13 02:55
2004.06.27
Messages


6-1083771426
Filat
2004-05-05 19:37
2004.06.27
LDAP, как и чем его можно юзать в Delphi?


3-1085836984
Слэш
2004-05-29 17:23
2004.06.27
Расширить поле CHAR


14-1086694212
gn
2004-06-08 15:30
2004.06.27
Первая компьютерная сеть защищена на квантовом уровне


9-1078046012
Cerber
2004-02-29 12:13
2004.06.27
diablo 1





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский