将数字四舍五入为指定的精度

时间:2016-02-19 06:49:00

标签: c++

任务是:我的号码是a = 2.7182818284590452353602875。

逗号后是25位数。我需要编写一个程序,将这个数字舍入到指定的精度。

精度被限制为0 <0。 n&lt; 100。

例如:

  

输入:0

Output: 3
     

输入:25

Output: 2.7182818284590452353602875
     

输入:4

Output: 2.7183

等等。

这是我的代码。它工作正常,但如果n> 17 ...

,我将离开unsigned long long范围
#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 个答案:

答案 0 :(得分:2)

基本问题是:双精度的最大精度约为17位。即使你写double a=2.7182818284590452353602875;,也会忽略最后的数字。

如果你真的需要100位数的og准确度,你必须使用一个特殊的库,其中一个(GMP)已在评论中提到。

如果您不需要更高的准确度,只有输出格式对您很重要,请使用:

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

答案 1 :(得分:0)

这可以通过printf精度设置来完成:

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

根据C ++和C标准,输出应该舍入(不仅仅是截断)值(C:7.21.6.1.8:&#34;该值四舍五入到适当的位数。&# 34。

使用iostreams

可以实现相同的结果
std::cout << std::fixed << std::setprecision(precision) << value;

如果你想自己实现它,你可以这样做而无需将值转换为整数,例如使用ceil()floor()modf()等功能。

请注意,您可以通过将精度设置为0打印来打印存储在floatdouble中的整数值。

您可以使用以下代码开始(不进行舍入,只是截断)并根据您的需要进行修改。

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);
}

答案 2 :(得分:0)

自己找到新的解决方案^^&#34;

    #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;
}

感谢大家的回复! ^^