Ответ 1
Первое и самое важное правило: используйте десятичный тип данных, никогда не имеющий двоичных типов с плавающей запятой.
Когда нужно выполнить точное округление, могут быть предусмотрены правила, такие как преобразование между
Мне любопытно существование каких-либо "округлых" стандартов ", когда дело доходит до расчета финансовых данных. Мои первоначальные мысли состоят в том, чтобы выполнять округление только тогда, когда данные предоставляются пользователю (уровень представления).
Если для дальнейших вычислений используются "округленные" данные, следует использовать "округлую" фигуру или "сырую" цифру? Есть ли у кого-нибудь совет?
Обратите внимание, что я знаю о различных методах округления, т.е. округлении банкиров и т.д.
Первое и самое важное правило: используйте десятичный тип данных, никогда не имеющий двоичных типов с плавающей запятой.
Когда нужно выполнить точное округление, могут быть предусмотрены правила, такие как преобразование между
Я просто попросил программиста-мейнфрейма greybeard в финансовой компании, в которую я работаю, и сказал, что нет известного стандарта, и это касается практики программистов.
В то время как статистикам известно о проблеме округления с по крайней мере 1906 года, трудно найти финансовый стандарт, одобряющий его.
В соответствии с это сидит, "Отчет Европейской комиссии Введение евро и округление валютных сумм предполагает, что ранее не было стандартного подхода к округлению банковского дела ".
В общем, используйте симметричный режим округления независимо от того, в какой базе вы работаете (base-2 или base-10).
Это позволит избежать систематического смещения во время вычислений.
Такой режим - круглый-полу-четный, иначе известный как "округление банкиров".
Используйте языковые инструменты, которые позволяют указывать числовую контекстную экспликацию, включая режимы округления и усечения. Например, модуль Python decimal
. Неявные предположения, сделанные библиотекой C, могут оказаться непригодными для ваших вычислений.
Я не видел существования "одного стандарта, чтобы управлять ими всех" - существует любое количество правил округления (как вы указали), и они, похоже, вступают в игру на основе кода отрасли/клиента и валюты (http://en.wikipedia.org/wiki/ISO_4217) - так как не все используют 2 места после десятичной, проблема становится еще более сложной. В конце дня ваш клиент должен указать правила, которые они хотят реализовать...
Обидно, что нет четких стандартов на это, как для руководства программиста, так и для защиты в суде. Простое "регулярное" округление в сторону ближайшего к заработной плате может привести к недоплате несколькими копейками на зарплату тут и там, что-то, что адвокат по труду съедает как трещина.
Хотя базовая ставка заработной платы может быть указана только в двух десятичных разрядах ("Вы наняты по 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 долл. США для ставки на платежном квитанции.
Теперь расчеты окупаемости не связаны с копейкой, и теперь вы должны объяснить это, но даже если это в пользу работника, может быть достаточно, чтобы адвокат по труду почувствовал запах крови в воде и начал искать других. вещи.
Один из подходов заключается в том, чтобы всегда склоняться в пользу работника, а не в естественном направлении, поэтому не может быть обвинения в систематическом краже заработной платы.
Рассмотрим использование масштабированных целых чисел.
Другими словами, храните целые числа пенни вместо дробных чисел долларов.