2009-11-08 1 views
0

Вот мой код:Явное округления чисел более 7 знаков после запятой в C++

double round(char* strNumber, int decPlace); 

int main() 
{ 
    int decimal; 
     char initialNumber[256]; 

    cout << "Enter decimal and number " << endl; 

    cin >> decimal; 
    cin >> initialNumber; 

    cout << setprecision (15) << round (initialNumber,decimal) << endl; 

return 0; 
} 

double round(char* strNumber, int decPlace)// 
{ 
    double number = atof(strNumber); 
    int temp = (int) (pow(10.0,decPlace) * number + 0.5); 
    double result = (double) temp/pow(10.0,decPlace); 
    return result; 
} 

Он работает до 6 знаков после запятой. В противном случае это дает какой-то странный результат. Ниже приведены цифры, которые я использовал для тестирования и вывода:

Тест 1 раунд до 7 знаков после запятой

105.265 

52.5689745694 

25.6835 

452.689785 

12.456789877458 

Выход

105.265 

52.5689746 

25.6835 

-214.7483648 

12.4567899 

Тест 1 раунд до 8 знаков после запятой

те же цифры, что и ранее

Выход

-21.47483648 

-21.47483648 

-21.47483648 

-21.47483648 

12.45678988 

ответ

6

Как говорили другие, приведение к int не будет работать с большими числами. Вы могли бы рассмотреть возможность использования floor вместо этого, и чтобы количество быть округлены в double:

#include <cstdlib> 
#include <cmath> 

double round(char* strNumber, int decPlace) 
{ 
    double number = std::atof(strNumber); 
    double expo = std::pow(10.0,decPlace); 
    return std::floor(expo * number + 0.5)/expo; 
} 
+0

Это именно то, что мне нужно. – Mike55

+0

@Pat: тогда вы должны «принять» ответ. –

1
int temp = (int) (pow(10.0,decPlace) * number + 0.5); 

температуры, вероятно, 32 бита. Он может задержать около +2 миллиарда. Переполнение.

1

Мне кажется overflow. pow(10.0,decPlace) * number - довольно большое число - слишком большое, чтобы поместиться в 32-битное целое число (это то, что int, вероятно, находится на вашей платформе).

3

int может содержать меньший диапазон, чем double; на многих платформах его максимальное значение составляет около 2 миллиардов, что меньше, чем pow(10.0,8) * number для большинства ваших номеров ввода.

Вы можете сохранить свой номер в качестве double и использовать floor округлить до целого числа:

double temp = floor(pow(10.0,decPlace) * number + 0.5); 
double result = temp/pow(10.0,decPlace);