Есть ли способ сделать это без использования потока? Например, что-то вроде этого:
double a = 6.352356663353535;
double b = a.precision(5);
вместо:
double a = 6.352356663353535;
std::cout.precision(5);
std::cout << a << std::endl;
Я новичок в C ++, и мне любопытно. Заранее спасибо.
double
s почти повсеместно реализуются как IEEE числа с плавающей точкой. Их точность зависит только от размера номера (в случае double
, что означает «число с плавающей запятой двойной точности», Это 53 бита). Невозможно вручную установить точность числа с плавающей запятой.
точность отображения всегда является свойством форматирования вывода, а не числа. Не пытайтесь изменить число с помощью округления, операция не имеет смысла. Вы не нужно уменьшить точность числа, кроме как для отображения.
Я пересмотрел код с учетом предложений @john, @Konrad и @ KennyTM. Я проверил, что это работает с отрицательными числами.
#include <cmath>
#include <cstdio>
using namespace std;
int main()
{
double a = 6.352356663353535;
double intpart;
double fractpart = modf (a, &intpart);
fractpart = roundf(fractpart * 100000.0)/100000.0; // Round to 5 decimal places
double b = intpart + fractpart;
printf("%.5lf", b);
}
Выходы
6.35236
double
всегда имеет одинаковую внутреннюю точность (наиболее вероятно, 53 бита двоичной точности), независимо от того, что вы делаете. Только при записи двойного в виде текста в десятичной форме вы можете контролировать десятичную точность вывода. Поэтому нет, вы не можете установить точность двоичного числа двойной точности ни на что, кроме его собственной точности (не говоря уже о десятичной точности).
Если все, что вам нужно, это округлить число до заданного числа десятичных цифр, тогда обратитесь к Phillipответ (но с поправками, которые Джон а также Konrad сделал в своих комментариях, конечно). Но обратите внимание, что это не меняет предисловие базового типа, и все вычисления с этим числом будут выполняться в двоичной двойной точности. Также такое округленное десятичное число не обязательно должно быть представлено точно в базовом двоичном типе с плавающей запятой.
Если вы действительно хотите выполнить точную десятичную арифметику, то вам нужно искать сторонние библиотеки, предоставляющие фактические десятичные числа с плавающей запятой.