?

Log in

No account? Create an account
Main

Бухгалтерское округление

Ну вот опять, я лох. Участвовал в написании биллинга для провайдера, а такой классики не знаю.

Оказывается бухгалтеры округляют свои цифры не, как учат в школе, а до ближайшего четного:
Банковское округление (англ. banker's rounding) — округление для этого случая происходит к ближайшему чётному. Это позволяет устранить систематическую ошибку округления при суммировании большого количества чисел. То есть, 2,5 → 2, 3,5 → 4.
http://ru.wikipedia.org/wiki/Округление

На практике же либо делают рассчеты с использованием десятых долей копеек и коругляют только в конце, либо считают с обычными копейками, а результат округляют до десятков копеек
http://www.buh.ru/itemsItem-462

спасибо
slonik_v_domene

Comments

про банковское округление тоже не знал. я правильно понял, что округление до ближайшего четного происходит только в случае, если крайняя цифра 5? :)
именно так.

в остальном случае обычное математическое.
Этого, боюсь, и большинство бухгалтеров не знают. ;)
А я как раз для биллинга такое применял на питоне ;-)
Я не понял, чем float так плох.
а вы попробуйте в нем повыражать цены в мильон. получите обычные выражения вида 10 в степени x. А нам как раз нужны значимые цифры, а не порядки. Опять же складывать много позиций, тут нужна точность до копеек, а не до порядка величины.
мы уже на вы? это ж я, valshооter.

я специально миллионными ценами не баловался, но автоматом выставляю тип поля в mysql float, и ни разу не было проблем. надо таки decimal (*,2)?
может оно так уж жестко и не надо, но значительно удобнее. попробуйте, - почувствуете, особенно при ценах в миллион. Или при сумме цен в миллион. Мне вот как-то пришлось с такими ценами поработать, и я переделав тип данных ощутил, что так лучше.
теперь надо почитать про разницу, потому что начну везде совать decimal.
не знаю, как в Оракле, а в MS SQL Server был даже тип такой money
для float (1 + 100000000) == 100000000. Для копеек песец приходит раньше, как раз на миллионе. В случае накапливающихся ошибок песец вообще может прийти утром.

int main()
{
	float f1 = 100000000;
	float f2 = f1 + 1;
	printf("%d\n", f1 == f2);
}

а хранить лучше в int (bigint), а для операций с - использовать специально обученный класс
Так делают не только бухгалтеры, а и floating point units (tie break to even).