我们知道在C/C++语言中浮点数的比较存在精度误差, 当给定的float有效数在6位以内转换为字符不会丢失精度,当有效位数大于6位就会存在精度丢失。
因此我们无法用(float a==float b)进行判定,因为两个浮点类型或者是双精度类型的差值小于设定的容许差值即可认为两个数是近似相等的, 即 |x - y| < ε(x、y 为两个浮点类型或者双精度类型的数据,ε 为容许差值)。
那么这个容许差值 ε 有多大?
通常,在比较两个双精度(double)类型的数值时,ε 设置为1E-14,而在比较两个单精度(float)类型的数值时,ε 设置为 1E-7。
所以我们要精确的比较两个浮点数的大小时,可以采用字符串的处理方法来逐位实现高精度比较。
下面是我给出的C++代码实现
#include <iostream>
#include <string>
using namespace std;
void trans(string *a,string *b){
string *temp;
if(a->length()>b->length()){
temp=b;
b=a;
a=temp;
}//固定a长度较短b较长
}
int main() {
string a,b;
int n,i;
cin>>a>>b;
trans(&a,&b);
int lena=(int)a.length();
int lenb=(int)b.length();
if(a[0]=='-'&&b[0]!='-'){
cout<<"<";
exit(0);
}
if(a[0]!='-'&&b[0]=='-'){
cout<<">";
exit(0);
}
// 先考虑一正一负的比较
for( i=0;i<lena;++i){
if(a[i]=='.'&&b[i]!='.'){
cout<<"<";
exit(0);
}
else{
if(a[i]!='.'&&b[i]=='.'){
cout<<">";
exit(0);
}//判断小数点出现的位置
else{
if(a[i]>b[i]){
cout<<">";
exit(0);
}
else{
if(a[i]<b[i]){
cout<<"<";
exit(0);
}//逐位比较
else{
continue;
}
}
}
}
}
if(i==lena&&lena<lenb)
cout<<"<";
else cout<<"=";
return 0;
}
复制代码