Я ищу стандарт с фиксированной точкой для использования в финансовых данных, знаете ли вы все, что стоит попробовать? Есть ли у вас опыт работы с этими классами с фиксированной точкой ручной работы?
Что вы используете для представления неподвижных точек в С++?
Ответ 1
В Dr.Dobb есть статья о возможной реализации арифметического типа с фиксированной точкой в С++. Проверьте этот вне.
Ответ 2
Уч. Финансовые системы сложны, основная проблема - не математика с фиксированной точкой, проблема в ошибках округления.
У вас может быть хорошая электронная таблица, заполненная maverlous расчетами со скидками по типу клиента и с учетом НДС. Вы делаете итог, вы представляете его бухгалтеру, и он говорит, что все значения ошибочны. Причина: выход может быть сформирован только с двумя знаками после запятой, но внутри значение имеет все десятичные числа поплавка или двойное. и они действительно складываются.
Вам нужно знать свои финансовые показатели и решать, где будут базовые значения. Смысл того, какие значения будут проверять бухгалтеры (да, это требует знания бизнеса, hance "сложная" часть).
Перед сохранением значения в постоянной форме (база данных, файл, память...) вы обрезаете лишние десятичные разряды, которые могут добавляться умножениями и делениями.
Быстрое и грязное решение для N знаков после запятой: ((double) ((int) (значение * N * 10.0)))/10.0
Конечно, вам нужно точно проверить, какой тип округления требует ваших финансовых результатов.
Ответ 3
Я использую свой математический класс с фиксированной точкой. Он предназначен для более или менее замены замены поплавков/парных. http://codef00.com/coding
РЕДАКТИРОВАТЬ. В качестве побочной заметки я бы лично не использовал для этой цели класс с фиксированной точкой. Вместо этого я бы просто сохранил количество центов (или десятых долей процента, или сотых процента по мере необходимости). Просто сделайте математику прямо с этим. Затем я бы масштабировал значение соответствующим образом при отображении пользователям.
Ответ 4
IBM decNumber ++
Ответ 5
ISO задала десятичное расширение для C, TR 24732 и С++, TR 24733. Они доступны для денег на веб-сайте ISO. Это еще не часть опубликованного стандарта С++. GCC предоставляет встроенные типы и реализацию библиотеки, Другая реализация - доступная от Intel. Самый последний толчок для включения этого в С++ - здесь.
Ответ 6
Для 64-битного типа int должно быть достаточно для представления всех финансовых значений в центах.
Вам просто нужно быть осторожным, чтобы округлить проценты правильно, для некоторого определения правильного.
Ответ 7
Попытка прямого ответа
У Маркуса Тренквальдера есть функция, которая поддерживает некоторые математические функции - http://www.trenki.net/content/view/17/1/:
Библиотека состоит из различных функций для обработки чисел с фиксированной точкой (умножение, деление, инверсия, sin, cos, sqrt, rsqrt). Он также содержит класс оболочки С++, который может использоваться для упрощения работы с числами с фиксированными точками. Я использовал этот класс чисел с фиксированной точкой в сочетании с моей библиотекой 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 Десятичная плавающая арифметическая спецификация, ориентированная на финансовые приложения, особенно в тех случаях, когда юридические требования требуют использования десятичной, а не двоичной арифметики с плавающей запятой (так как вычисление, выполняемое с помощью двоичных операций с плавающей запятой, может ввести небольшие, но неприемлемые ошибки).
Это НЕ фиксированная точка, но я думал, что это очень полезно для людей, которые ищут ответ на этот вопрос.