62.0 == 62.0返回false,为什么?

时间:2014-01-18 14:41:53

标签: c++ casting compare type-conversion static-cast

我真的很讨厌我无法解决的问题。我有这个代码片段:

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!

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

3 个答案:

答案 0 :(得分:4)

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

也许您可以查看详情:http://www.parashift.com/c++-faq/floating-point-arith.html

答案 1 :(得分:0)

双重时间造成了恼人的错误...... 它似乎是62.0,但实际上它是61.9999999 ......但是当你打印它时,它会给你写62 ... 试试这个:

if (62.0 == totalTransaction + 0.01)
do something

答案 2 :(得分:0)

当您检查两个双打的相等性时,您在正确的路径上指定epsilon,例如可接受的保证金。

double a = 62;
double b = 62.0000000000001;
double eps = 1e-10;

if (abs(a-b) < eps) {
    cout << "match!" << endl;
}