c++ - 控制台输出某个值 - 如果在它之后直接声明不使用相同的值

标签 c++ struct

cout << levelData.interactMap[tileHitX][tileHitY] << endl;
if(levelData.interactMap[tileHitX][tileHitY] == 1.8)
        cout << "pls werk" << endl;

所以 cout 输出 1.8...但是 if 语句不起作用。

这是一个函数,我在其中传递结构成员以使用 & 指针。

它在这个 if 语句中。

if(levelData.interactMap[tileHitX][tileHitY] >= 1 & levelData.interactMap[tileHitX][tileHitY] <= 1.8)
{
    levelData.interactMap[tileHitX][tileHitY] = levelData.interactMap[tileHitX][tileHitY] + 0.1;
    chop.play();

    cout << levelData.interactMap[tileHitX][tileHitY] << endl;
    if(levelData.interactMap[tileHitX][tileHitY] == 1.8)
        cout << "pls werk" << endl;
}

调用函数

int action(int facing, sf::Sprite& player, sf::View& view, sf::Clock& actionTimer, levelData& levelData, sf::Sound& chop)

和函数的定义

int action(int, sf::Sprite&, sf::View&, sf::Clock&, levelData&, sf::Sound&);

谢谢

最佳答案

正如几条评论中提到的, float 在平等方面有点奇怪。这是因为,为了使用合理数量的内存, float 不是精确存储的,而是使用越来越小的 2 的幂(即 2^-1 + 2^-2 + 2^-4....)来近似存储的。正如您所料,这意味着存在误差幅度,具体取决于多种因素。

就您的问题而言,归结为:不要在 float 上使用“==”。相反,检查它是否在误差范围内,例如:

float acceptableThresholdOfError = .0001;
if(fabs(levelData.interactMap[tileHitX][tileHitY] - 1.8) <= acceptableThresholdOfError)
{ //code }

显然,所需的精度决定了错误阈值应该/可以有多小。这样,即使您的变量不是完美的近似值,只要它“足够接近”就可以被认为是这样。

关于c++ - 控制台输出某个值 - 如果在它之后直接声明不使用相同的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18925171/

相关文章:

c - 使用 (*variable).member 与 *variable.member 取消引用 struct Struct_type 的成员

c - 如何防止打印结构的下一个变量?

c++ - 如何从 C++ 中的函数返回结构

c - Berkeley套接字通信、发送和接收结构

c++ - 使用 lambda 调用的默认函数对象值作为函数参数

c++ - 如何在Eigen中对矩阵进行FFT?

c++ - 将 FFTW 库添加到 QT 项目中

c++ - VALGRIND:如何将 valgrind 用于 ".so"库?

c++ - OpenProcess() 成功,但 EnumProcessModules() 失败

c# - 当您从 C# 中的结构返回 "this"时会发生什么?