C# 离奇的分裂行为
我知道,乍一看,这将得到重复提及。很可能是这样,但我想大多数人会认为答案与这个问题相似: 这不是我的情况。在这种情况下,将较小的数字除以较大的整数,得到0。这是有道理的。发生在我身上的事毫无意义 这是我的密码:C# 离奇的分裂行为,c#,C#,我知道,乍一看,这将得到重复提及。很可能是这样,但我想大多数人会认为答案与这个问题相似: 这不是我的情况。在这种情况下,将较小的数字除以较大的整数,得到0。这是有道理的。发生在我身上的事毫无意义 这是我的密码: decimal correctedImageWidth = screenWidth / maxColumnsWithMaxSizeImages; screenwidth的值是int,它是1024。MaxColumnSWithMaxSizeImage的值也是一个int,为3 不知何故,c
decimal correctedImageWidth = screenWidth / maxColumnsWithMaxSizeImages;
screenwidth的值是int,它是1024
。MaxColumnSWithMaxSizeImage的值也是一个int,为3
不知何故,correctedImageWidth
变为0。这是奇数,因为1024/3不等于0,四舍五入的数字也不会是0,就像其他SO问题一样。你会认为我会得到类似于341
的东西。以下是我所说的数字的证明:
正如您在我的手表中看到的那样screenWidth
为1024,MaxColumnSwithMaxSizeImage
为3。但是,将这2划分为correctedImageWidth
是0?有什么理由让我从中得到0吗?我已经向同样感到困惑的同事们展示了这一点。这是我的全部代码,也许我在做什么?不太可能,因为它们都是整数,并且都有有效的整数值。但很明显我一定在做什么?代码如下:
int maxColumnsWithMaxSizeImages = (int)System.Math.Ceiling(decimal.Divide(1024, 480));
if (maxColumnsWithMaxSizeImages < _minimumImagesPerRow)
{
.....
} else if (maxColumnsWithMaxSizeImages > _maximumImagesPerRow)
{
....
} else
{
//between 2 and 4 columns
var screenWidth = App.ScreenWidth;
decimal correctedImageWidth = (decimal)((decimal)screenWidth / (decimal)maxColumnsWithMaxSizeImages);
decimal test2 = 1024 / 3;
decimal test3 = (decimal)1024 / (decimal)3;
var test = correctedImageWidth;
}
intmaxColumnsWithMaxSizeImages=(int)System.Math.天花板(decimal.Divide(1024480));
如果(maxColumnsWithMaxSizeImages<_MinimumImages如箭头所示)
{
.....
}else if(maxColumnsWithMaxSizeImages>\u MaximumImagesError)
{
....
}否则
{
//在2到4列之间
var screenWidth=App.screenWidth;
decimal correctedImageWidth=(十进制)((十进制)屏幕宽度/(十进制)maxColumnsWithMaxSizeImages);
十进制test2=1024/3;
十进制测试3=(十进制)1024/(十进制)3;
var测试=校正的图像宽度;
}
更新
出于某种原因,我的变量声明中似乎存在冲突。尽管我在不同的范围内声明了它们,但无论出于什么原因,这都会引发冲突。重命名变量后,我得到了正确的值 您已经定义了两次字段correctedImageWidth
,一次是int
(在if
块中),一次是decimal
(在else
块中)
手表窗口的屏幕截图显示键入的int
字段值,此时显示0
(在else
块中输入后未分配)。尝试查看decimal
键入的字段,或者在调试时将鼠标悬停在另一个decimal
键入的字段上,它应该会显示正确的值。您已经定义了该字段correctedImageWidth
两次,一次为int
(在if
块中),另一次为decimal
(在else
块中)
手表窗口的屏幕截图显示键入的int
字段值,此时显示0
(在else
块中输入后未分配)。试着观察decimal
键入的字段,或者在调试时将鼠标悬停在另一个decimal
键入的字段上,它会显示正确的值。对我来说,结果是341
:A会让这个问题变得非常好。你尝试过重建吗?屏幕截图上还显示了correctedImageWidth
是一个整数,而else语句则不是。我可以确认我得到了341
的正确输出。您的结果,以及本地窗口中的一些粗略结果,使我认为这是Visual Studio的问题。请尝试重新启动并再次测试。在屏幕截图中的观察窗口中,correctedmageWidth
是int
。不是decimal
,int
。在代码屏幕截图的底部,黄色条所在的位置,有一个correctedImageWidth
声明为十进制。在上面的块中,还有一个correctedImageWidth
声明为int
。有多少个变量和字段你有这个名字吗?是什么让你觉得你没有混淆哪个是哪个?对我来说,结果是341
:A会让这个问题变得非常好。你尝试过重建吗?屏幕截图还显示correctedImageWidth
是一个整数,而对于else语句来说不是这样。我可以确认我得到了正确输出341
。您的结果以及本地窗口中的一些粗略结果使我认为这是Visual Studio的问题。请尝试重新启动并再次测试。在屏幕截图中的监视窗口中,correctedImageWidth
是int
。而不是decimal
,int
。位于您的代码屏幕截图,黄色条所在的位置,有一个声明为十进制的correctedImageWidth
。在上面的块中,另一个correctedImageWidth
声明为int
。您有多少个变量和字段以该名称命名,是什么让您认为您不会混淆哪个是哪个?太好了分析,IMHO这是VS调试器的另一个错误。从停止代码的位置可以很清楚地看出,另一个int
变量超出了范围,因此调试器不应该显示该变量,而应该显示在范围内的变量。@stakx是的,完全正确。原因已作为注释发布(两次),因为它只是一个猜测,作为一个answer@Sayse:猜测可能会转化为确定性。OP可以尝试将int
变量重命名为另一个唯一的名称。如果这解决了问题,那么我们知道猜测是正确的。我还建议重新启动VS