Windows 表格应用中的数学运算
Math Operation in Windows Form Application
我正在尝试使用 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;
}
你得到的是 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 被认为是整数 try
Console.WriteLine(1/500);
它将 0 写入控制台。
Console.WriteLine(1/500.0);
Console.WriteLine((float)1/500);
Console.WriteLine((double)1/500);
所有这些都将 8.192 写入控制台。
然后在你拥有 double 或其他更准确的数据类型后,如果你真的想要一个 int,请考虑四舍五入。
一个integer
除法会去掉小数位。所以在你的情况下,296/500 你会期望 0.592。由于 integer
没有小数位,它会将它们截断,结果为 0。
将 oldX
加倍并除以 500.0
这是正常的。因为 oldX 是一个整数,所以当您除以它时,它会四舍五入(舍去小数点后的所有内容)。我会把它转换成浮点数然后再转换成整数,就像这样
int newX = (int)(((float)oldX / 500) * 4096);
这将保留整个数字,直到您最后完成。您还需要对 Y 值执行相同的操作
我正在尝试使用 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;
}
你得到的是 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 被认为是整数 try
Console.WriteLine(1/500);
它将 0 写入控制台。
Console.WriteLine(1/500.0);
Console.WriteLine((float)1/500);
Console.WriteLine((double)1/500);
所有这些都将 8.192 写入控制台。
然后在你拥有 double 或其他更准确的数据类型后,如果你真的想要一个 int,请考虑四舍五入。
一个integer
除法会去掉小数位。所以在你的情况下,296/500 你会期望 0.592。由于 integer
没有小数位,它会将它们截断,结果为 0。
将 oldX
加倍并除以 500.0
这是正常的。因为 oldX 是一个整数,所以当您除以它时,它会四舍五入(舍去小数点后的所有内容)。我会把它转换成浮点数然后再转换成整数,就像这样
int newX = (int)(((float)oldX / 500) * 4096);
这将保留整个数字,直到您最后完成。您还需要对 Y 值执行相同的操作