为啥这个计算(除法)会返回错误的结果?
Posted
技术标签:
【中文标题】为啥这个计算(除法)会返回错误的结果?【英文标题】:Why does this calculation (division) return a wrong result?为什么这个计算(除法)会返回错误的结果? 【发布时间】:2017-01-24 11:36:30 【问题描述】:我在使用 C++ 时遇到了一个奇怪的问题。在 OpenGL 代码中,我尝试以这种方式计算一个简单的表达式
void mouse(int button, int state, int x, int y)
double posx = (x-300)/300;
double posy = -1*(y-300)/300;
switch(button)
case GLUT_LEFT_BUTTON:
if(state == GLUT_DOWN)
if(count < max)
particles[count].x = posx;
particles[count].y = posy;
particles[count].active = true;
count++;
glutPostRedisplay();
break;
default:
break;
但由于某种原因,每个粒子都出现在屏幕中心。奇怪的是,当我将double posx = (x-300)/300
替换为
double posx;
posx = x-300;
posx = posx/300;
(对 y 相同)代码有效...有人知道为什么会这样吗?也许这是一件非常简单的事情,我做错了。自从我使用 C++ 以来已经很久了,如果这是我的一个简单的错误,请见谅。
【问题讨论】:
(x-300)/300;
进行整数除法,而您希望它进行浮点数学运算?
posx be double 不工作?我没有在 x 上存储浮点值
【参考方案1】:
x
是 int
,300
也是 int
。所以计算将使用整数算术完成,即忽略余数。这就是为什么当您期望在0.0
和1.0
之间的值时,该除法将返回0
。 对于计算的结果,将结果保存到哪种类型的变量都没有关系。
在第二个示例中,您将x-300
分配给double posx
。因此,从现在开始,您将进行浮点运算,得出预期的结果。
另一种使其工作的方法是将300
替换为300.0
。
【讨论】:
好的,现在我明白为什么要把“.0”放在浮动值上'^^ 谢谢你,抱歉这个菜鸟问题以上是关于为啥这个计算(除法)会返回错误的结果?的主要内容,如果未能解决你的问题,请参考以下文章