提问者:小点点

Windows窗体应用程序中的数学运算[重复]


我试图在windows窗体应用程序中使用一个函数,将给定的点转换为另一个坐标系。然而,我遇到了一个奇怪的问题。输入正确,但输出始终为0。首先,我认为它是由局部变量引起的,然后我用整数代替变量,但它没有求解。我对此一无所知。这里的代码和输出基本上是:

string[] newPoint1 = convertPoints(X1, Y1);

string[] convertPoints(int oldX, int oldY)
        {
            //int newX = ((oldX - oldLeft) / (oldRight - oldLeft)) * (newRight - newLeft);
            MessageBox.Show(oldX.ToString());   // output is 296 
            int newX = (oldX / 500) * 4096;   // ?????????????????????  (296/500) * 4096  = 0 ?????????????
            MessageBox.Show(newX.ToString()); // here output is 0
            int newY = newTop + ((oldY - oldTop) / (oldBottom - oldTop)) * (newBottom - newTop);
            
            //MessageBox.Show(newY.ToString());
            string[] newPoints = {newX.ToString(), newY.ToString()};
            //MessageBox.Show(newPoints[0], newPoints[1]);
            return newPoints;
        }

共3个答案

匿名用户

这是正常的。因为oldX是一个整数,当你除以它时,它会四舍五入(删除小数后的任何内容)。我会把它转换成浮点数再转换成整数

int newX  = (int)(((float)oldX / 500) * 4096);

这将保留整个数字,直到您在最后完成。你也需要对Y值做同样的事情

匿名用户

一个整数除法去掉小数点。所以在你的例子中,296/500,你会期望0.592。由于integer没有小数点,因此它会将它们截断,结果为0。

oldX更改为双倍并除以500.0

匿名用户

你得到0,因为oldX/500通常是一个分数,因为你使用int数据类型,所以只能是整数。我建议做的是改变数据类型,然后四舍五入。

  //Old code
  int newX = (1 / 500);
  Console.WriteLine(newX);
  // writes 0 to console


  //New code
  double newXD = (1 / 500.0) * 4096;
  Console.WriteLine(newXD);
  //Writes 8.192

1和500被认为是整数

Console.WriteLine(1/500);

它将0写入控制台。

Console.WriteLine(1/500.0);
Console.WriteLine((float)1/500);
Console.WriteLine((double)1/500);

所有这些都将8.192写入控制台。

然后,如果你有双精度或其他更精确的数据类型,如果你真的想要一个int,考虑舍入。