为什么这个计算(除法)会返回错误的结果?

时间:2017-01-24 11:36:31

标签: c++

我对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 ++以来已经很久了,很抱歉,如果这是我的一个简单错误。

1 个答案:

答案 0 :(得分:4)

xint300也是int。因此,计算将使用整数算术来完成,即忽略余数。这就是为什么当您期望00.0之间的某个内容时,该部门会返回1.0对于计算结果,将结果保存到哪种类型的变量无关紧要。

在第二个示例中,您将x-300分配给double posx。所以从这一点开始,你会做浮点算术,从而产生预期的结果。

使其发挥作用的另一种方法是将300替换为300.0