Что вы используете для представления с фиксированной точкой в ​​C ++? - PullRequest
20 голосов
/ 28 сентября 2008

Я ищу стандарт с фиксированной запятой для финансовых данных, знаете ли вы какой-нибудь, который стоит попробовать? У вас есть какой-нибудь опыт работы с этими классами ручной работы с фиксированной запятой?

Ответы [ 7 ]

6 голосов
/ 28 сентября 2008

Я использую свой класс математики с фиксированной точкой. Это разработано, чтобы быть более или менее заменой поплавков / двойников. http://codef00.com/coding

РЕДАКТИРОВАТЬ : Как примечание, я бы лично не использовал класс с фиксированной точкой для этой цели. Вместо этого я бы просто сохранил количество центов (или десятых или сотых долей по мере необходимости). Просто посчитай прямо с этим. Затем я соответствующим образом масштабирую значение при отображении для пользователей.

6 голосов
/ 28 сентября 2008

Уч. Финансовые системы хитры, ваша главная проблема не в математике с фиксированной точкой, проблема в ошибках округления.

У вас может быть хорошая электронная таблица, заполненная неверными расчетами, со скидками по типу клиента и НДС. Вы делаете итог, вы представляете это бухгалтеру, и он говорит, что все значения неверны. Причина: выходные данные могут быть отформатированы только с двумя десятичными разрядами, но внутренне значение имеет все десятичные разряды с плавающей запятой или двойные. и они складываются.

Вы должны знать свои финансовые показатели и решать, где будут находиться базовые значения. То есть, какие ценности будут проверять бухгалтеры (да, это требует знания бизнеса, иногда «хитрая» часть).

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

Быстрое и грязное решение для N десятичных знаков: ((double) ((int) (Значение * N * 10.0))) / 10.0

Конечно, вам необходимо точно проверить, какой тип округления требуется для ваших финансовых данных.

6 голосов
/ 28 сентября 2008

Dr.Dobb's имеет статью о возможной реализации арифметического типа с фиксированной запятой в C ++. Проверьте это .

0 голосов
/ 17 января 2014

Пытаюсь ответить прямо

У Маркуса Тренквальдера есть тот, который поддерживает некоторые математические функции - http://www.trenki.net/content/view/17/1/:

Библиотека состоит из различных функций для работы с числами с фиксированной точкой (умножение, деление, инверсия, sin, cos, sqrt, rsqrt). Он также содержит класс-оболочку C ++, который может использоваться для упрощения работы с числами с фиксированными точками. Я использовал этот класс чисел с фиксированной точкой в ​​сочетании с моей библиотекой vector_math для получения векторной математической библиотеки с фиксированной точкой. Это сделало 3D-вычисления намного быстрее по сравнению с версией с плавающей запятой.

Автор высказал мнение, что его платформа не поддерживает плавающую точку, поэтому он и сделал это. Кроме того, обратите внимание, что это для 3D-рендеринга, вопрос был для финансовые данные , и мы хотим хорошую библиотеку математических функций ....

IEEE 754-2008 Десятичная арифметика с плавающей запятой, предназначенная для финансовых приложений

Это похоже на устоявшийся способ обработки финансовых данных с хорошей поддержкой (от Intel и IEEE) - http://software.intel.com/en-us/articles/intel-decimal-floating-point-math-library

Цитировать:

IEEE 754-2008 Спецификация десятичной арифметики с плавающей точкой, предназначенная для финансовых приложений, особенно в тех случаях, когда в соответствии с требованиями законодательства необходимо использовать десятичную, а не двоичную арифметику с плавающей точкой (поскольку вычисления, выполняемые с помощью двоичных операций с плавающей точкой, могут вносить небольшие, но недопустимые ошибки).

Это НЕ с фиксированной точкой, но я подумал, что это очень полезно для людей, ищущих ответ на этот вопрос.

0 голосов
/ 10 января 2014

64-битного типа int должно быть достаточно для представления всех финансовых значений в центах.

Вам просто нужно быть осторожным, чтобы правильно округлить проценты, для некоторого определения , правильного .

0 голосов
/ 10 января 2014

ISO указывает десятичное расширение для C, TR 24732 и C ++, TR 24733. Они доступны для денег на веб-сайте ISO . Это еще не часть какого-либо опубликованного стандарта C ++. GCC предоставляет встроенные типы и библиотечную реализацию этого . Другая реализация доступна от Intel . Самый последний толчок для включения этого в C ++ это здесь .

0 голосов
/ 28 сентября 2008
...