Подтвердить что ты не робот

Что вы используете для представления неподвижных точек в С++?

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

4b9b3361

Ответ 1

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

Ответ 2

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

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

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

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

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

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

Ответ 3

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

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

Ответ 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 Десятичная плавающая арифметическая спецификация, ориентированная на финансовые приложения, особенно в тех случаях, когда юридические требования требуют использования десятичной, а не двоичной арифметики с плавающей запятой (так как вычисление, выполняемое с помощью двоичных операций с плавающей запятой, может ввести небольшие, но неприемлемые ошибки).

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