2017-02-02 5 views
1

Я знаю, на первый взгляд, это будет дублировать упоминание. И это очень хорошо, но я думаю, что большинство людей думает, что ответ подобен этому вопросу: Division returns zeroНеобычное поведение деления

Это не мое дело. В этом случае деление меньшего числа на большее число целых чисел и получение 0. Это имеет смысл. То, что происходит для меня, не имеет смысла.

Вот мой код:

decimal correctedImageWidth = screenWidth/maxColumnsWithMaxSizeImages; 

Значение screenwidth, который является INT, является 1024. Значение maxColumnsWithMaxSizeImages, также int, равно 3.

Каким-то образом correctedImageWidth становится 0. Это нечетно, потому что 1024/3 не равно 0, и округленное число не равно 0, как и другие вопросы, которые были у SO. Вы думаете, что я получу что-то вроде 341. Вот доказательство того, что эти цифры, что я говорю, что они являются:

Proof

Как вы можете увидеть в моем watch. screenWidth - 1024, maxColumnsWithMaxSizeImages - 3. Однако разделение этих 2 на correctedImageWidth равно 0? Есть ли причина, почему я получаю 0 от этого? Я показал это коллегам, которые в равной степени смущены. Вот мой весь код, возможно, есть что-то, что я делаю? Вряд ли, поскольку они оба являются ints, и оба они имеют действительные целочисленные значения. Но, очевидно, должно быть что-то, что я делаю? Вот код:

 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; 
     } 

UPDATE По какой-то причине, кажется, что там был конфликт в моих объявлениях переменных. Хотя я объявил их обоих в разных областях, по какой-то причине это вызывало конфликт. После переименования переменной я получаю исправленное значение.

+1

Для меня результат '341': https://dotnetfiddle.net/AtXbS5 –

+0

Итак, что вы получаете за' test2' и 'test3'? Кроме того, поскольку вы переходите к 'decimal', вы теперь делаете десятичное деление. –

+5

[mcve] сделает этот вопрос действительно хорошим. – chris

ответ

5

Вы определили поле correctedImageWidth дважды, один раз как intif блоке) и один раз как decimalelse блоке).

Скриншот вашего окна просмотра показывает значение введенного поля int, которое показывает 0 в этот момент (не было назначено с вашего места в блоке else). Попробуйте просмотреть введенное поле decimal или просто наведите указатель мыши на другое поле ввода decimal во время отладки, оно должно показать правильное значение.

+2

Отличный анализ, ИМХО это еще одна ошибка отладчика VS. Совершенно ясно, откуда был остановлен код, что другая переменная 'int' выходит за пределы области видимости, поэтому отладчик не должен отображать * это *, но тот, который находится в области видимости. – stakx

+0

@stakx да точно. – jdmdevdotnet

+2

Причина, по которой это уже было опубликовано как комментарий (дважды), заключается в том, что это просто предположение, которое не полезно в качестве ответа – Sayse

Смежные вопросы