任务是:我的号码是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;
}
有关如何改进或使其有效的任何建议?
答案 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打印来打印存储在float
或double
中的整数值。
您可以使用以下代码开始(不进行舍入,只是截断)并根据您的需要进行修改。
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;
}
感谢大家的回复! ^^