以下是我试图用来决定玩家是否向左或向右移动棋子的功能。 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;
}
答案 0 :(得分:3)
将float
或double
变量与精确的float
或double
字面值进行比较始终存在问题!另外,使用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){..}
...