Проблема округления в Visual C ++ для валютных данных - PullRequest
3 голосов
/ 14 марта 2012

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

Например, внутри двойной переменной
35.25, сохраненной как 35.249999999999999999999 35.75, сохраненной как 35.750000000000000000001

, поэтому, когда она пытается округлить число до одной десятичной точки 35.25 = 35.3 35.75 = 35.8

Это означает, что одно число округляется до потолка, а другое - до пола.

  1. Кто-нибудь может предложить решение этой проблемы?

  2. Какой подходящий тип данных следует использовать для валютных данных в Visual C ++

Ответы [ 2 ]

6 голосов
/ 14 марта 2012

IEEE-754 определяет разные типы данных как имеющие разные уровни значащих цифр.

Например, IEEE-754 определяет двойное значение как имеющее только десятичный десятичный разряд точности 15,95.

Таким образом, один из вариантов - убедиться, что вы остаетесь в пределах максимальной точности, округлив окончательное значение до числа значащих цифр, которое меньше этого максимального предела.

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

Например, спотовые цены на валюту обычно указываются на 4 десятичных знака, а ставки - на 7 десятичных знаков.

Таким образом, без дополнительной информации о том, какой тип расчета вы делаете, немного сложно предложить решение.

3 голосов
/ 14 марта 2012

Ваша проблема не в округлении.Это то, как значения с плавающей точкой представлены в компьютере.

Именно поэтому double не очень хорошо подходит для расчетов, связанных с валютой.
Как и рекомендовано @Mysticial, вы можетепопробуйте использовать int и использовать центы вместо долларов или евро в качестве единицы для ваших расчетов.

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

Логика для преобразования значений в читаемые человеком единицы, такие как евро иДоллары могут полностью зависеть от пользовательского интерфейса, поэтому только при отображении вы должны позаботиться о преобразовании центов в евро.

Образец

Вот пример, демонстрирующий отсутствие потери точности.

int a = 25;             //  0.25 eurodollars
int b = 1000;           // 10.00 ED
int sum = a + b;        // 10.25 ED
int difference = b - a; //  9.75 ED
...