Как обрабатывать double 3.14567 как 3.14 (т.е. с заданным разрешением)

#c

#c

Вопрос:

Мне было интересно, есть ли в c какой-либо способ обработать double с заданной точностью. например, число 3.1345 будет рассматриваться как 3.13, а число 0.009 будет рассматриваться как 0 (точность 2 после точки).

Мне нужно, чтобы это применялось к математическим операциям. например:

 double a = 0.009;
double b = 3.12345

//a should be considered as 0, b as 3.12

double c = a*b // should output 0.
double d = a b // should output 3.12
  

поскольку функция setprecision() предназначена для std, мне было интересно, есть ли какая-либо другая функция для этого.

Спасибо

Ответ №1:

Это никогда не будет корректно работать с doubles. Удвоения — это двоичные дроби, они не имеют десятичных знаков или десятичной точности. Прочитайте руководство по плавающей запятой для получения подробной информации.

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

Комментарии:

1. FWIW, внутреннее представление — это совершенно другая тема, чем форматированный вывод. Число может иметь разрешение в 100 знаков после запятой, но может быть напечатано только с 2. Большинству программистов нравится иметь лучшее внутреннее разрешение.

Ответ №2:

Самый простой способ:

 int a100 = int(a*100);
int b100 = int(b*100);
int c100 = a100 * b100; // Will be 0
int d100 = a100   b100; // Will be 312
  

Комментарии:

1. Конечно, это можно улучшить, определив decimal<N> шаблон с соответствующими iostream перегрузками.

Ответ №3:

double a = 3.12345; double b = ((int) a * 100) / 100.0;

Комментарии:

1. И если «((int) a*100) / 100.0» не может быть идеально представлено как double? Это не всегда будет работать.

2. Но я был в процессе ввода этого как «ближайшего» решения, учитывая, что он придерживается double. Однако следует упомянуть об этом недостатке.

Ответ №4:

взгляните на floor() и ceil()

http://www.cplusplus.com/reference/clibrary/cmath/floor/

a=этаж (a); b=этаж(b * 100)/100;