Я пытаюсь сделать что-то очень простое, но у меня болит голова.
Мне нужно написать функцию, которая будет округлять значение двойного аргумента до числа десятичных знаков, указанного в n.
Я получил большую часть этого, но по какой-то причине результат = ….. вычисляет только первую строку алгоритма округления (см. Ниже)
В результате вместо округления числа оно просто перемещает десятичную точку на число мест, указанное в n. Мой код ниже:
#include <iostream>
#include <cmath>
using namespace std;
double round(double x, int n)
{
double result;
result =
x * pow(10, n);
x = x + 0.5;
x = floor(x);
x = x / pow(10, n);
return result;
}
int main()
{
cout << round(-2.9, 0) << endl;
cout << round(-2.59, 1) << endl;
cout << round(.0059, 2) << endl;
cout << round(1.23467, 3) << endl;
cout << round(9.999999, 4) << endl;
return 0;
}
Вы можете получить лучшие результаты с чем-то вроде:
double round(double x, int n) {
x = x * pow(10, n);
x = x + 0.5;
x = floor(x) / pow(10, n);
return x;
}
Проблема в том, что в исходном коде вы назначаете result = x * pow(10, n);
, но затем приступите к выполнению всех остальных ваших операций, используя x
вместо result
,
Вы также можете объединить некоторые из ваших утверждений, чтобы уменьшить количество строк в вашем методе, или даже пойти на однострочное, как return floor(x * pow(10, n) + 0.5) / pow(10, n);
, Не то чтобы это обязательно лучше, но когда все, что вы делаете, это математика, вы не необходимость выполнять каждую операцию в отдельной строке.
Ваш round()
возвращается result = x * pow(10, n)
Так чего же ты ожидал?