我有一个自定义代码,用于将浮点数从基数 10 转换为在标准输入中读取的另一个基数。通过将浮点数除以基数并将数字倒写来实现在浮点数的浮点之前转换为数字的另一个基数。浮点数之后的数字的转换是通过将它们乘以基数来实现的,并将浮点数之前的数字顺序写入这个临时结果中。
问题是我是这样一个事实的受害者,例如以 10 为底的 0.8 之类的浮点数在二进制中没有有限表示(因此它们被写为 7.9999 ...)。因此,对于 input2.8
或任何大于 2 且以 .8 结尾的输入,( 2.8
, 3.8
, 4.8
) 即使我离开以 10 为底,我也会得到输出:(2.79999..., 3.79999..., 4.79999.. .)。
问题是:我该如何解决这个问题,为什么我不会在 0.8 或 1.8 上遇到同样的错误?
这是代码:
#include <iostream>
using namespace std;
void printInt(int *a,int k,int base)
{
if (base<10){
for (int i=k-1;i>=0;i--)
cout << a[i];
}else{
for (int i=k-1;i>=0;i--)
{
if (a[i]<10)
cout<<a[i];
else if (a[i]==10)
cout<<"A";
else if (a[i]==11)
cout<<"B";
else if (a[i]==12)
cout<<"C";
else if (a[i]==13)
cout<<"D";
else if (a[i]==14)
cout<<"E";
else cout<<"F";
}
}
}
void printRem(int *a,int k,int base)
{
if (base<10)
{
for(int i=0;i<k;i++){
cout<<a[i];
}
}else{
for(int i=0;i<k;i++)
{
if (a[i]<10)
cout<<a[i];
else if (a[i]==10)
cout<<"A";
else if (a[i]==11)
cout<<"B";
else if (a[i]==12)
cout<<"C";
else if (a[i]==13)
cout<<"D";
else if (a[i]==14)
cout<<"E";
else cout<<"F";
}
}
}
int main ()
{
double n;
int base;
cin>>n;
cin>>base;
int *whole,*rem,numWhole,numRem;
whole=NULL;
numWhole=0;
rem=NULL;
numRem=0;
double floatPart= n - (int)n;
int intPart=(int)n;
while (intPart!=0)
{
int *temp=new int[numWhole+1];
int remainder;
remainder=intPart%base;
intPart=intPart/base;
if (whole!=NULL)
for (int i=0;i<numWhole;i++)
temp[i]=whole[i];
delete [] whole;
temp[numWhole] = remainder;
whole=temp;
numWhole++;
}
while (floatPart!=0)
{
int *temp=new int[numRem+1];
double nov;
nov=floatPart*base;
if (rem!=NULL)
for (int i=0;i<numRem;i++)
temp[i]=rem[i];
temp[numRem]=(int)nov;
numRem+=1;
delete [] rem;
rem=temp;
floatPart=nov-int(nov);
if (numRem==10)
break;
}
printInt(whole,numWhole,base);
if (rem!=NULL) cout<<".";
printRem(rem,numRem,base);
cout<<endl;
cin >> n;
return 0;
}