在double类型的精度问题上遇到困难.
代码如下:
#include <iostream>
#include <cstring>
#include <cmath>
using namespace std;
char tmp[128];
int getPoint(char *a,int &index){
for(index;index < 128;index++){
if(a[index] == '.') return index;
}//找到小数点位置
}
double transformToDouble(char *a, int index){
double result = 0;
if(index == 0){
for(int i = 1; i < strlen(a)+1; i++){
result += (a[i] -'0')* pow(10,index-i);
}
}
else{for(int i = 0; i < strlen(a); i++){
if(i < index) result += double(a[i]-'0')*(pow(10,index - i -1));
if(i > index) result += double(a[i]-'0')*(pow(10,index - i));
}}
return result;
}//将字符串转换为double类型
char* returnChar(double num){
int inter = num, level = 0;
while(inter != 0){
inter /= 10; level++;
}
inter = num;
tmp[level] = '.';
for(int i = level - 1; i >= 0; i--){
tmp[i] = inter % 10 +'0';
inter /= 10;
}//将整数部分转换为字符串
double flo = num - (int)num;
if(flo == 0) return tmp;
else{
/*int i = level + 1;
while(flo != 0){
int a = flo * 10;
tmp[i] = a+'0';
flo = flo*10-a;*/
//需要补充,未解决在小数点后double类型运算的精度缺失问题,会出现1.3+1.4=2.6999999的现象,导致结果错误
}
return tmp;
}
}
int indexA = 0,indexB = 0;
void add_float(char* a, char* b, char* res) {
getPoint(a,indexA);
getPoint(b,indexB);
double a1 = transformToDouble(a,indexA);
double b1 = transformToDouble(b,indexB);
strcpy(res,returnChar(a1+b1));
}
int main()
{
char num1[128], num2[128], res[128];
cin >> num1;
cin >> num2;
add_float(num1, num2, res);
cout << res << endl;
return 0;
}