62.0 == 62.0 返回 false,为什么



我遇到了非常烦人的问题,我无法解决。我有这个代码片段:

LOG(INFO) << "totalTranslation: " << m_move.totalTranslation << " tileSize: " << static_cast<double>(tileSize);
if(m_move.totalTranslation >= static_cast<double>(tileSize)) {
    LOG(INFO) << "in!";
}

tileSize等于 62(它是 int )。在循环中,我增加了m_move.totalTranslation值。问题是,当m_move.totalTranslation等于 62 时,它不会输入if语句。但是,如果它大于 62,则确实如此。查看生成的日志:

I0118 15:20:11.788576  5644 GameObject.cpp:270] totalTranslation: 61.008 tileSize: 62
I0118 15:20:11.806589  5644 GameObject.cpp:270] totalTranslation: 62 tileSize: 62
I0118 15:20:11.822602  5644 GameObject.cpp:270] totalTranslation: 62.93 tileSize: 62
I0118 15:20:11.822602  5644 GameObject.cpp:272] in!

如您所见,仅当 totalTranslation 大于 62 时,才会记录in!。为什么?我认为这可能是铸造问题,但我将这种int类型的tileSize投射到double,仍然没有区别。

为了比较浮点数之间的相等性,最好看到数字的接近度,因为浮点数在计算机中的内部表示。您可能需要检查这些数字是否相距epsilon距离。相等比较的结果取决于特定的编译器/计算机。

也许你可以看看这个了解更多细节:http://www.parashift.com/c++-faq/floating-point-arith.html

Double 有时犯了烦人的错误...看似是62.0,但实际上却是61.9999999...但是当你打印它时,它会给你写 62...试试这个:

if (62.0 == totalTransaction + 0.01)
do something

当您检查两个双精度的相等性时,您正走在一条正确的道路上,可以指定 epsilon,例如可接受的边距。

double a = 62;
double b = 62.0000000000001;
double eps = 1e-10;
if (abs(a-b) < eps) {
    cout << "match!" << endl;
}

相关内容

  • 没有找到相关文章

最新更新