c ++ if语句问题

时间:2014-04-06 20:31:01

标签: c++ if-statement

以下是我试图用来决定玩家是否向左或向右移动棋子的功能。 moveTo包含一个像5.2这样的小数,moveFrom将保持方形数6.3,差值将为-1.1并分配给moveValue(我正在使用trace语句检查它并且它正在分配正确)。

然而,当它击中ifs时它不会出现相等,因此它运行最后一个if语句,但是如果我硬编码-1.1到moveValue它确实正确评估。任何没有正确评估的想法都会有很大的帮助。我在代码下发布了运行程序的输出:

int legalPlayerMove(float moveTo, float moveFrom)
{

    float moveValue=(moveTo-moveFrom);
    cout<<"trace move value"<<moveValue<<endl;


    if(moveValue==(-1.1))
        cout<<"moved up left"<<endl;
    if(moveValue==(-0.9))
        cout<<"moved up right"<<endl;
    if(moveValue!=-1.1||moveValue!=-.9)
        cout<<"that is not a legal move, please renter the square number you wish to move to."<<endl;

    return 0;
}
  • 请输入您要移动的作品的位置
  • 6.3
  • 现在请输入你要移动的地方
  • 5.2
  • trace move value-1.1
  • 这不是一个合法的举动,请租用您想要搬到的方格号。
  • 按任意键继续。 。

3 个答案:

答案 0 :(得分:3)

floatdouble变量与精确的floatdouble字面值进行比较始终存在问题!另外,使用operator==一般不是一个好主意。

使用对比值的最小差异(又名epsilon):

if(std::numeric_limits<float>::epsilon() + moveValue > 1.1) { // ...
}

答案 1 :(得分:1)

除了上述内容之外,没有精确表示0.1或其二进制倍数。它是2的无限系列权力。

无法保证编译器会像运行时库对输入值进行舍入一样对常量值进行舍入。

你应该使用整数对来做你正在做的事情。

您关心数字的文本表示与其固有价值的混淆。

答案 2 :(得分:0)

#define EPS 0.000001
if(EPS + moveValue > 1.1){..}
...