2017-02-02 20 views
1

一見したところ、これは重複した言及を得るでしょう。そしてそれは非常にうまくいくかもしれませんが、ほとんどの人が答えがこの質問に似ていると思うと思います。Division returns zero奇妙なディビジョンビヘイビア

これは私のケースではありません。その場合、より小さい数をより大きい整数で割って0にすることです。それは理にかなっています。私のために起こっていることは意味をなさない。

はここに私のコードです:screenwidthため

decimal correctedImageWidth = screenWidth/maxColumnsWithMaxSizeImages; 

値、int型で、1024です。 maxColumnsWithMaxSizeImagesの値(intも)は3です。

どうにかして、correctedImageWidthは0になります。他のSOの質問のように、1024/3が0に等しくなく、四捨五入された数値も0にならないため、奇妙です。あなたは341のようなものを得るだろうと思うだろう。

Proof

あなたは私のwatchで見ることができるように:ここでは数字は、私は彼らが言うことをしていることの証明です。 screenWidthが1024の場合、maxColumnsWithMaxSizeImagesは3です。ただし、これらの2をcorrectedImageWidthに分割すると、0?私がこれから0を得る理由がありますか?私はこれを同じように混乱している同僚に示しました。ここに私のコード全体があります。おそらく私がやっていることがありますか?おそらく、両方ともintであり、両方とも有効な整数値を持っていると考えられます。しかし、明らかに私がやっていることがあるはずですか?ここでは、コードです:

 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

あなたは一度(ifブロックで)intなどと(elseブロックで)decimalとして1回、2回フィールドcorrectedImageWidthを定義しました。

ウォッチウィンドウのスクリーンショットには、この時点で0と表示されているint型付きフィールド値が表示されます(elseブロック内に割り当てられていません)。 decimal型付きフィールドを見てみるか、デバッグ中に他のdecimal型フィールド上にマウスを置くだけで正しい値が表示されます。

+2

偉大な分析、IMHOこれはまだ別のVSデバッガーのバグです。他の 'int'変数がスコープから外れているので、デバッガは* that *を表示すべきではなく、代わりにスコープにあるものを表示すべきです。 – stakx

+0

@stakxはい。 – jdmdevdotnet

+2

これがコメントとして既に投稿された理由(2回)は、回答としては役に立たない推測であるためです。 – Sayse