С++ двойная точность и округление

У меня есть следующая проблема:

double a = 6.005; double b = 5.995;

Я хочу установить точность удвоения 2 цифры после точки, например

double c = a+b;// I would like to get 11.99 not 12.00.

Как я могу это сделать?


person Community    schedule 29.07.2011    source источник
comment
Неважно ... Я понял, что вы пытались сказать сейчас ... вы хотите выбросить все после 2-го десятичного знака ..   -  person Pepe    schedule 29.07.2011
comment
Точно! Проверьте свое критическое мышление!!!   -  person    schedule 29.07.2011
comment
Проверьте свой тон... делать что-то не так - это одно... гордиться и не знать об этом - совсем другое... Я предлагаю вам переосмыслить свое "решение"   -  person Pepe    schedule 29.07.2011
comment
Пожалуйста, объясните, каким должно быть a*b. double, конечно, является типом с плавающей запятой, и ваша точка не плавает.   -  person MSalters    schedule 29.07.2011
comment
Не мог бы ОП отредактировать вопрос, теперь, когда ясно, что требуется a = 6.005 -> 6.00 и тому подобное?   -  person Dilettant    schedule 29.07.2011


Ответы (4)


Точность — это одно; округленное для отображения совсем другое.

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

ОБНОВИТЬ:

Вы не должны представлять валюту, используя двойные числа. В прошлый раз, когда я смотрел, C++ был объектно-ориентированным языком. Вы должны создать абстракцию для Money, которая делает правильные вещи и абстрагирует эти детали от клиентов класса.

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

person duffymo    schedule 29.07.2011
comment
+1 Я полностью согласен ... округление должно быть последним шагом в расчетах - person Pepe; 29.07.2011
comment
Предположим, что это удвоение означает доллары и центы! Тогда у меня не может быть 11 долларов и 995 центов. Итак, я хочу знать, есть ли какая-нибудь готовая функция в C++, которая сделает это за меня 11.995==›11.99 - person ; 29.07.2011
comment
Вы не должны представлять валюту, используя двойные числа. В прошлый раз, когда я смотрел, C++ был объектно-ориентированным языком. Вы должны создать абстракцию для Money, которая делает правильные вещи и абстрагирует эти детали от клиентов класса. - person duffymo; 29.07.2011
comment
IIRC, банки обычно производят расчеты в микродолларах. Да, это 6 лишних цифр, а не 2. - person MSalters; 29.07.2011
comment
Конечно - им нужны полномочия для начисления процентов. Бьюсь об заклад, они все еще недовольны числами с плавающей запятой двойной точности. Микродоллары будут нуждаться как минимум в длинных позициях. - person duffymo; 29.07.2011

Я хочу установить точность удвоения 2 цифры после точки

Просто умножьте на 100 и используйте целые числа.

person Maxim Egorushkin    schedule 29.07.2011
comment
Я знаю так. Но есть ли какая-нибудь функция в C++? Я хочу выучить язык. - person ; 29.07.2011
comment
Только не начинайте их умножать. - person R. Martinho Fernandes; 29.07.2011

Вероятно, вам следует использовать числа с фиксированной точкой:

unsigned int a = 600;
unsigned int b = 599;

unsigned int c = a + b;

unsigned int make_fixed(double d) { return d * 100; }

void print_fixed(unsigned int n) { std::cout << n/100 << "." << n%100; }
person Kerrek SB    schedule 29.07.2011

Нет, вам нужно либо настроить все значения по одному (mul на 100, принять часть int, div на 100), либо вам нужно написать свой собственный класс MySpecialDouble (который делает то же самое только за сценой).

person imre    schedule 29.07.2011