В некотором смысле то, что вы запрашиваете, невозможно:
Значения с плавающей запятой на большинстве распространенных платформ не имеют понятия «количество десятичных разрядов».Числа вроде 2.3 или 8.71 просто не могут быть представлены точно.Следовательно, нет смысла запрашивать какую-либо функцию, которая будет возвращать значение с плавающей запятой с заданным числом ненулевых десятичных разрядов - такие числа просто не существуют .
.единственное, что вы можете сделать с типами с плавающей запятой, это вычислить ближайшее представимое приближение, а затем распечатать результат с требуемой точностью, что даст вам текстовую форму числа, которое вы хотите.Чтобы вычислить представление, вы можете сделать это:
double round(double x, int n)
{
int e;
double d;
std::frexp(x, &e);
if (e >= 0) return x; // number is an integer, nothing to do
double const f = std::pow(10.0, n);
std::modf(x * f, &d); // d == integral part of 10^n * x
return d / f;
}
(Вы также можете использовать modf
вместо frexp
, чтобы определить, является ли x
целым числом. Вы также должны проверить, что n
является неотрицательным, или иначе определяет семантику для отрицательной «точности».)
В качестве альтернативы использованию плавающих типов точек, вы можете выполнить фиксированная точечная арифметика.То есть вы храните все как целых чисел , но вы рассматриваете их как единицы, скажем, 1/1000.Затем вы могли бы напечатать такое число следующим образом:
std::cout << n / 1000 << "." << n % 1000;
Сложение работает, как и ожидалось, хотя вы должны написать свою собственную функцию умножения.