在实际开发过程中,由于遇到了关于float型数据比较大小的场景,好在及时发现了其中的坑,故在此做个记录,以便回顾。
直接上代码
// 输入一个数,判断该数是否在0.58±0.1这个区间中,如果在,就输出“正常”;否则输出“异常”
#include<iostream>
using namespace std;
int main() {
float val = 0;
cout << "please input a value:\n";
while (cin>>val) {
if (abs(val - 0.58) > 0.1) {
cout << "异常\n" << endl;
}
else {
cout << "正常\n" << endl;
}
}
return 0;
}
测试用例与程序实际输出结果如下图所示:
从上图可以看到程序在临界值出现是判断错误,在参数为0.48和0.68时都应该输出“正常”,但实际输出的却是“异常”。
修改代码,添加精度补偿值后的代码如下:
#include<iostream>
using namespace std;
int main() {
float precision = 0.000001f;// 精度补偿值
float val = 0;
cout << "please input a value:\n";
while (cin>>val) {
if (abs(val - 0.58) > (0.1 + precision)) {
cout << "异常\n" << endl;
}
else {
cout << "正常\n" << endl;
}
}
return 0;
}
加入精度补偿后,结果都正确
再例如下面的代码
// 输入一个数,判断该数是否在0.44±0.1这个区间中,如果在,就输出“正常”;否则输出“异常”
#include<iostream>
using namespace std;
int main() {
//float precision = 0.000001f;
float val = 0;
cout << "please input a value:\n";
while (cin>>val) {
if (abs(val - 0.44) > (0.1)) {
cout << "异常\n" << endl;
}
else {
cout << "正常\n" << endl;
}
}
return 0;
}
测试用例与程序实际输出结果如下图所示:
从结果可以看到当参数为0.54的时候发生了异常,正常来说应该输出“正常”,实际却输出了“异常”
修改代码,加入精度补偿后结果如下:
#include<iostream>
using namespace std;
int main() {
float precision = 0.000001f;
float val = 0;
cout << "please input a value:\n";
while (cin>>val) {
if (abs(val - 0.44) > (0.1 + precision)) {
cout << "异常\n" << endl;
}
else {
cout << "正常\n" << endl;
}
}
return 0;
}
由此可见,在实际开发过程中,适当的加入精度补偿有助于提高程序的正确性,平时也应养成好习惯