2016-02-19 3 views
1

Задача: У меня есть номер a = 2.7182818284590452353602875.Округление номера до указанной точности

Это 25 цифр после запятой. Мне нужно написать программу, которая будет округлять это число до указанной точности.

Точность ограничена, чтобы быть 0 < < н 100.

Например:

Входной сигнал: 0

Output: 3 

Входной сигнал: 25

Output: 2.7182818284590452353602875 

ввода : 4

Output: 2.7183 

и так далее.

Это мой код. Он отлично работает, но я выхожу из unsigned long long диапазона, если п> 17 ...

#include <iostream> 
#include <iomanip> 
#include <cmath> 
#include <math.h> 
using namespace std; 

int main() 
{ 
    double a=2.7182818284590452353602875; 
    double b=a; 

    unsigned long long c=a; 
    int n; 
    int kiek=0; 
    cin>>n; 

    while (1!=0){ 
b=b*10; 
c=b; 
if (kiek==n) break; 
kiek++; 
cout<<c<<endl; 
    } 
    cout<<c<<endl; 
if((c%10)>4) {c=c/10+1;} 
else {c=c/10;} 


double atgal=1; 
for(int i=0;i<n;i++){ 
    atgal*=10; 
} 

cout<<endl<<atgal<<endl; 
b=c; 
b=b/atgal; 
cout<<fixed<<setprecision(n)<<b; 
} 

Любые предложения о том, как улучшить его или заставить его работать?

+3

Если вы хотите точность по сравнению с большим количеством цифр, то будет остановлен по точности самого типа. Вы можете использовать библиотеку, такую ​​как GMP. –

+2

[tag: C++] is not [tag: c] .. – LPs

+1

Просто используйте строку. –

ответ

2

Основная проблема заключается в следующем: максимальная точность двойного значения составляет около 17 цифр. Даже если вы пишете double a=2.7182818284590452353602875;, последние цифры игнорируются.

Если вам действительно нужна точность до 100 цифр и точность, вы должны использовать специальную библиотеку, один из которых (GMP) указан в комментариях.

Если вам не нужна более высокая точность и только выходной формат очень важен для вас, используйте:

std::cout << std::setprecision(n) << a; 
+0

Mhmm ... спасибо! Но я могу использовать только библиотеки по умолчанию. Мне нужно отправить это в другой компилятор, который я могу 't редактировать или включать конкретные библиотеки ... – WildCAt

+0

setpreciosion просто вырезает числа. Мне нужно математически обойти его :(2.718 ~ 2.72 – WildCAt

+0

Добавить 'fixed' to round:' std :: cout << fixed << std :: setprecision (n) << a; ' –

0

Это может быть сделано с printf точности настройки:

printf("%.*f", precision, value); 

Выход должен быть округленным (не только усеченным) значением в соответствии со стандартами C++ и C (C: 7.21.6.1.8: «Значение округляется до соответствующего количества цифр».).

Тот же результат может быть достигнут с помощью iostreams:

std::cout << std::fixed << std::setprecision(precision) << value; 

Если вы хотите реализовать его самостоятельно, вы можете сделать это без когда-либо преобразования значения в целое число, например, используя такие функции, как ceil(), floor(), или modf().

Обратите внимание, что вы можете напечатать целое значение, хранящееся в float или double распечатав его с точностью равен 0.

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

double integerPart = 0; 
double fractionalPart = 0; 
// print the integer part 
fractionalPart = modf(value, &integerPart); 
printf("%.0f", integerPart); 
// print the decimal point 
printf("."); 
// print the fractional part digit by digit 
for (int i = 0; i < precision; ++i) { 
    fractionalPart *= 10; 
    fractionalPart = modf(fractionalPart, &integerPart); 
    printf("%.0f", integerPart); 
} 
0

Найдено новое решение по себе ^^»

#include <iostream> 

using namespace std; 

int main() 
{ 
    int sk[25]={7,1,8,2,8,1,8,2,8,4,5,9,0,4,5,2,3,5,3,6,0,2,8,7,5}; 
    int n=0; 
    cin>>n; 
    if(n==0) cout<<3; 
    else if (n==25) { 
      cout<<2<<"."; 
     for(int i=0;i<n;i++){ 
      cout<<sk[i]; 
     } 
    } 
    else{ 
    if (sk[n]>4){ 
      if(sk[n-1]==9){ 
        sk[n-1]=0; 
        sk[n-2]++; 
      } 
    else sk[n-1]++; 

    } 
    cout<<2<<"."; 
    for(int i=0;i<n;i++){ 
     cout<<sk[i]; 
    } 
    } 

    return 0; 
} 

Спасибо всем за ваши ответы !!! ^^

Смежные вопросы