2016-05-04 16 views
6

私はこのコードを持っています。変な奇妙な(浮動小数点のような)

static int test = 100; 
     static int Test 
     { 
      get 
      { 
       return (int)(test * 0.01f); 
      } 
     } 

出力は次のとおりです。0

しかし、このコードは

static int test = 100; 
    static int Test 
    { 
     get 
     { 
      var y = (test * 0.01f); 
      return (int)y; 
     } 
    } 

異なるを返す出力は、次のとおりです:1

また、私は、このコード

static int test = 100; 
    static int Test 
    { 
     get 
     { 
      return (int)(100 * 0.01f); 
     } 
    } 

出力されてい1

私はILの出力を見て、私はなぜC#がコンパイル時にこの数学的演算を行い、出力が異なるのか理解していませんか? enter image description here

この2つのコードの違いは何ですか?なぜ私は変数の結果を使用することを決めた変更ですか?

+0

どのように値を確認しますか? – dotctor

+0

[浮動小数点数学は壊れていますか?](http://stackoverflow.com/questions/588004/is-floating-point-math-broken) – Liam

+3

私はそれを見ていましたが、正確な答え。しかし、この答えは、ビットをクリアすることがあります:http://stackoverflow.com/a/15117741/2594485 –

答えて

2

コンパイラがあなたを騙すので。コンパイラはすでにいくつかの数学を実行するのに十分なほどスマートなので、実行時にそれを行う必要はありません。無意味です。式100 * .01fは浮動小数点数の精度がなくてもコンパイラで計算されます(breaks you up on run-time)。

これを証明するには、static testconstにしてください。コンパイラがコンパイル時にあなたのために数学を行うことができることがわかります。あなたのサンプルのように、最初に変数に書き込むことは何もありません。実行時とコンパイル時は異なります。

+0

私は理解しています。しかし、これは私の質問ではありません。私はそれを取得します。コンパイラの解決 コンパイル時に定数matematical操作。これは本当に必要です。しかし、私はこの操作のための変数を使用して "結果"私はこれが間違っていると思いますか?なぜ結果は変化しているのですか?変数はちょうどプレースホルダですか? – Cevizli

+0

いいえ、定数値のコンパイル時の解決と実行時の表現には違いがあります。 –

関連する問題