Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/160.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将数字四舍五入到指定精度_C++ - Fatal编程技术网

C++ 将数字四舍五入到指定精度

C++ 将数字四舍五入到指定精度,c++,C++,任务是:我有数字a=2.718281828459042353602875 逗号后是25位。我需要写一个程序,将这个数字四舍五入到指定的精度 精度限制为0>n; 而(1!=0){ b=b*10; c=b; 如果(kiek==n)断裂; kiek++; cout基本问题是:双精度的最大精度约为17位。即使您写入double a=2.7182818284590452353602875;最后的数字也会被忽略 如果你真的需要高达100位的og精度,你必须使用一个特殊的库,其中一个(GMP)已经在评论中提到

任务是:我有数字a=2.718281828459042353602875

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

精度限制为0 例如:

输入:0

Output: 3
投入:25

Output: 2.7182818284590452353602875
投入:4

Output: 2.7183
等等

这是我的密码。它工作得很好,但如果n>17,我将超出
unsigned 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;
}
#包括
#包括
#包括
#包括
使用名称空间std;
int main()
{
双a=2.718281828459045353602875;
双b=a;
无符号长c=a;
int n;
int kiek=0;
cin>>n;
而(1!=0){
b=b*10;
c=b;
如果(kiek==n)断裂;
kiek++;

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

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

如果您不需要更高的精度,并且只有输出格式对您很重要,请使用以下方法:

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

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

printf("%.*f", precision, value);
<>输出应根据C++和C标准(C:7.21.61.8:“数值舍入到适当位数”)舍入(不只是截断)值。 使用
iostreams
可以获得相同的结果:

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

我自己找到了新的解决方案^”

#包括
使用名称空间std;
int main()
{
int sk[25]={7,1,8,2,8,1,8,2,8,4,5,9,0,4,5,2,3,3,6,0,2,8,7,5};
int n=0;
cin>>n;

如果(n==0)如果您希望精度超过大量数字,您将被类型本身的精度所阻止。您可以使用类似GMP的库。不是..Mhmm…谢谢!但我只能使用默认库。我需要将此文件发送到另一个编译器,我无法编辑或包含特定库…SetPrecision只需删除数字ed将其数学化为四舍五入:(例如,2.718~2.72Add
fixed
到round:
std::cout-Ummm。数字是2.7182818284590453602875。我需要得到2.71828182845904523。使用我的代码和n=17,我得到2.7182818284590465。使用std::cout,我在写大约17个有效数字时有点夸张了。实际上它更少。另外,你还需要c。)计算小数点前的数字。如果你真正深入了解细节,数字表示是一个复杂的主题。我建议的方法应该可以很好地工作,只要你保持远远低于浮点精度的限制。
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);
}
    #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;
}