问题的描述如题所示,具体的是《数据结构与算法分析-C语言描述》中的习题1.3
看了后面的答案,第一句是这样的
由于舍入误差, 一开始不明白这句话是什么意思,因为答案中是有RoundUp这个函数的。经过反复的揣摩,发现double在内存中的存储是这样的,以前一直没有发现
看到木有,定义的是8.1可在内存中显示的是趋近于8.1的数
接下来会研究下为什么会这样,下面是我补全后的代码
#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;
void PrintDigit(int n)
{
cout<<n;
}
double RoundUp(double N, int DecPlaces)
{
int i;
double AmountToAdd=0.5;
for(i=0;i<DecPlaces;i++)
AmountToAdd/=10;
return N+AmountToAdd;
}
int IntPart(double N)
{
return (int)N;
}
double DecPart(double N)
{
return N-(int)N;
}
void PrintFractionPart(double FractionPart, int DectPlaces)
{
int i,Adigit;
for (i = 0; i < DectPlaces; i++)
{
FractionPart*=10;
Adigit=IntPart(FractionPart);
PrintDigit(Adigit);
FractionPart=DecPart(FractionPart);
}
}
void PrintOut(unsigned int n)
{
if(n>=10)
PrintOut(n/10);
PrintDigit(n%10);
}
void PrintReal(double N, int DecPlaces)
{
int IntergerPart;
double FractionPart;
if(N<0)
{
putchar('-');
N=-N;
}
N=RoundUp(N, DecPlaces);
IntergerPart=IntPart(N); FractionPart=DecPart(N);
PrintOut(IntergerPart);
if(DecPlaces>0)
putchar('.');
PrintFractionPart(FractionPart, DecPlaces);
}
int main()
{
PrintReal(-8.101,3);
cout<<endl;
return 0;
}
运行结果: