首页 > 解决方案 > 双重数学和布尔检查给出错误的答案

问题描述

拿这个 c++ 代码:

double d = 0.3028 + 0.0028;
cout << d << endl;
if (d == 0.3056)
    cout << "match" << endl;
else
    cout << "not a match" << endl;

为什么输出“不匹配”?

标签: c++double

解决方案


那是因为浮点数是如何存储在内存中的。这是一篇很好的文章:https ://dev.to/visheshpatel/how-floating-point-no-is-stored-memory-47od

相反,如果“几乎相等”,则应检查浮点数(和双精度数)。在您的情况下,如果您只对小数点后 4 位感兴趣,那么您可以检查差异是否低于 0.00001。所以:

float epsilon = 0.00001;

double a = d; //your value
double b = 0.3056; //the value to which you are comparing

bool equal_ab = abs(a - b) < epsilon;

推荐阅读