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

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】:

xint300 也是 int。所以计算将使用整数算术完成,即忽略余数。这就是为什么当您期望在0.01.0 之间的值时,该除法将返回0对于计算的结果,将结果保存到哪种类型的变量都没有关系。

在第二个示例中,您将x-300 分配给double posx。因此,从现在开始,您将进行浮点运算,得出预期的结果。

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

【讨论】:

好的,现在我明白为什么要把“.0”放在浮动值上'^^ 谢谢你,抱歉这个菜鸟问题

以上是关于为啥这个计算(除法)会返回错误的结果?的主要内容,如果未能解决你的问题,请参考以下文章

excel2007除法结果为啥只有整数,怎样才能保留两位小数?

为啥Firebird在除法时会截断小数位?

为啥这个除法结果为零?

在C语言中除法运算为啥没有小数部分?

Int除法:为啥1/3 == 0的结果?

int除法:为啥1/3 == 0的结果?