Стандарты округления - финансовые расчеты
Мне любопытно, что существуют какие-либо "стандарты округления", когда речь идет о расчете финансовых данных. Мои первые мысли заключаются в том, чтобы выполнять округление только тогда, когда данные представляются пользователю (уровень представления).
Если "округленные" данные затем используются для дальнейших расчетов, следует ли использовать "округленную" фигуру или "необработанную" фигуру? У кого-нибудь есть совет?
Обратите внимание, что мне известны различные методы округления, например, округление банкиров и т. Д.
4 ответа
Первое и самое важное правило: используйте десятичный тип данных, никогда не используйте двоичные типы с плавающей точкой.
Когда именно должно быть выполнено округление, это может быть предписано правилами, такими как конвертация между евро и национальными валютами, которые она заменяет.
Если таких правил нет, я бы делал все вычисления с высокой точностью и округлял только для представления, то есть не использовал бы округленные значения для дальнейших вычислений. Это должно дать лучшую общую точность.
Я только что спросил программиста мэйнфрейма от "серой бороды" в компании, специализирующейся на финансовом программном обеспечении, на которую я работаю, и он сказал, что нет общеизвестного стандарта, и дело до программиста.
Хотя статистики знакомы с проблемой округления, по крайней мере, с 1906 года, трудно найти финансовый стандарт, одобряющий ее.
Согласно этому докладу, " отчет Европейской комиссии " Введение евро и округление валютных сумм " предполагает, что ранее не было стандартного подхода к округлению в банковской сфере".
В общем, используйте симметричный режим округления независимо от того, на какой базе вы работаете (база-2 или база-10).
Это позволит избежать систематического смещения во время расчетов.
Такой режим - Round-Half-To-Even, иначе известный как "округление банкиров".
Используйте языковые инструменты, которые позволяют указывать числовой контекстный контекст, включая режимы округления и усечения. Например, Python decimal
модуль. Неявные предположения, сделанные библиотекой C, могут не подходить для ваших вычислений.
Обидно, что нет четких стандартов на это, как для руководства программиста, так и для защиты в суде. Простое "регулярное" округление в сторону ближайшего к заработной плате может привести к недоплате несколькими копейками на зарплату тут и там, что адвокатам труда съедают, как крэку.
Хотя базовая ставка заработной платы может быть указана только в двух десятичных разрядах ("Вы наняты по 22,71 долл. США в час"), такие вещи, как смешанное сверхурочное время (определяемое путем усреднения нескольких ставок за период), в итоге приводят к эффективной почасовой ставке $23.37183475/ час.
Как вы платите сверхурочно на этом?
15 hours x 23.37183475 x 1.5 = $525.87 rounded from $525.86628187
15 hours x 23.37 x 1.5 = $525.82
ПОЧЕМУ ВЫ украли у моего клиента пять центов? К сожалению, я не шучу об этом.
Это становится еще более неудобным, когда вы рассчитываете при значении полной точности, но отображаете усеченную версию: вы делаете первый расчет выше, но отображаете только 23,37 долл. США для ставки в платежной квитанции.
Теперь расчеты окупаемости не связаны с копейкой, и теперь вы должны объяснить это, но даже если это в пользу работника, может быть достаточно, чтобы адвокат по труду почувствовал запах крови в воде и начал искать других. вещи.
Один из подходов заключается в том, чтобы всегда склоняться в пользу работника, а не в "естественном" направлении, поэтому никогда не может быть обвинения в "систематическом краже заработной платы".
Я не видел существования "единого стандарта, который бы управлял ими всеми" - существует множество правил округления (как вы указали), и они, похоже, вступают в игру, основываясь на отраслевом / клиентском / и валютном коде ( http://en.wikipedia.org/wiki/ISO_4217) - поскольку не все используют 2 знака после запятой, проблема становится еще более сложной. В конце дня ваш клиент должен указать правила, которые он хочет внедрить...
Рассмотрите возможность использования масштабированных целых чисел.
Другими словами, храните целые числа пенни вместо дробных чисел долларов.