给定一个double型数据a=1.344,如果不清楚其存储格式,很有可能犯如下错误:
double a=1.344;
int b=a;//1
double c=a-b;//3.44
c*1000以为就是344,但实际上编译器显示的是343;而当a=1.345时,最终c*1000显示的就是345.
很明显,这就涉及到double型数据的存储格式
double a=8.1,在存储中存储为8.099999999
故在利用取整函数之前首先需要把double型数据“五入”。
#include<iostream>
#include<stdio.h>
#include<math.h>
#include<string.h>
using namespace std;
#define M 20
void printdigit(int n){
cout<<n;
}
void printout(int N){
if(N>=10)printout(N/10);
printdigit(N%10);
}
double Roundup(double N,int Decplace){
int i;
double ave=0.5;
for(i=0;i<Decplace;i++)ave=ave/10;
return N+ave;
}//针对double数据存储特点,5入
int get_int(double N){return (int) N;}
double get_frac(double N){return (N-(int)N);}
void printFractionpart(double r,int Decplace){
int a=r;
int i=0;
while(i<Decplace){r=r*10;a=r;i++;}
printout(a);
}
void printreal(double N,int Decplace){
int int_part;
double fraction_part;
if(N<0){putchar('-');
N=-N;}
N=Roundup(N,Decplace);
int_part=get_int(N);
fraction_part=get_frac(N);
printout(int_part);
putchar('.');
printFractionpart(fraction_part,Decplace);
}
int main(){
int int_part;
double a;
double N=12.344;
printreal(N,3);
cout<<endl;
system("pause");
return 0;}