-2

次のコードを実行すると:

public int[] finalResult = new int[dimension];
public float[] calculatedValue = new float[dimension];
.....
.....
finalResult[i] = (int) Math.Floor(calculatedValue[i]);
Console.WriteLine( "calculated:" + calculatedValue[i] 
    +  " final:" + finalResult[i] 
    + "  test: " +(int) Math.Floor(calculatedValue[i]));

出力は次のとおりです。

計算:-0.02043936 最終:0 テスト:-1

まったく同じコードから生成されたときに「最終」が「テスト」と異なるのはなぜですか? 間違っているのはどれですか。なぜですか。

さらに単純で小さいフラグメント

finalResult[i]=(int)Math.Floor(-3.0002);
Console.WriteLine( "final: "+ finalResult[i]+ " test:" +(int)Math.Floor(-3.0002));

出力 最終:0 テスト:-4

以下は、最後に次のことを試したことを証明しているため、残りのコードは無関係です。

public int[] junkArray = new int[dimension];
junkArray[i]=(int)Math.Floor(-3.0002);  //Junk Array is only assigned here in whole code
Console.WriteLine( "final: "+ (int) junkArray[i]+ " test:" +(int)Math.Floor(-3.0002));

final:0 test:-4 として出力されます

4

3 に答える 3

3

これが実際に起こっていると私が思うことです。あなたが提供したコードはコンパイルされないので、私はここで仮定をしていることを覚えておいてください、そして私がそれを適応させようとすると、私はいつも私が期待する正しい結果を得る。したがって、私は意図的な間違いを犯して、得られる結果を生み出す方法を考えようとしました。

using System;

namespace ConsoleApplication1
{
    class Program
    {
        private static int dimension = 1;
        public static int[] junkArray = new int[dimension];

        static void Main(string[] args)
        {
            Method1();
            Method2();
        }

        static void Method1()
        {
            int i = 0;
            junkArray[i] = (int)Math.Floor(-3.0002);
        }

        static void Method2()
        {
            int i = 0;
            int[] junkArray = new int[dimension];
            Console.WriteLine("final: " + (int)junkArray[i] + " test:" + (int)Math.Floor(-3.0002));
        }
    }
}

これにより、表示されている結果が生成されます。

最終:0テスト:-4

コードを2つのメソッドに分割しました。1つは「計算」を実行するメソッドで、もう1つは「プレゼンテーション」を実行するメソッドです。ただし、何らかの理由(カフェインの不足など)で、2番目のメソッドは、計算結果を含むフィールドを非表示/シャドウイングする配列変数も宣言します。これは違法ではありませんが、Console.WriteLineメソッド呼び出しでjunkArrayから読み取ったときに、以前に結果を書き込んだものとは別のjunkArrayから読み取っていることを意味します。

これは起こっていることではないかもしれませんが、それは可能性であり、実際のコードを見ずに、私が提供できる最善の推測です。最初の配列を「シャドウイング」する2番目の配列ではなく、読み取り元の配列が結果を書き込んだ配列と確実に同じであることを確認してください。

于 2012-10-02T16:04:05.087 に答える
2

コードをテストすると

var final = new int[1];
var calc = new[] { -0.02043936f };
final[0] = (int)Math.Floor(calc[0]);

Console.WriteLine(
    "calc:{0} final:{1} test:{2}",
    calc[0],
    final[0],
    (int)Math.Floor(calc[0]));

当然のことながら、私は出力を取得します

計算:-0.02043936最終:-1テスト:-1

だから、あなたのコードに何か他の問題があります。

于 2012-10-02T15:15:53.257 に答える
0

ここで2つのことが起こっています

最初 - -0.02043936 は計算値です

これで math.floor が適用されます。それが何をするかというと、値を床に落として double を返しますが、これもかなり小さい数値になります。

今、あなたはそれを整数にキャストしています。そうしているうちに、ゼロに近づくため、ゼロになります。

これを証明するには、計算値を -0.62043936 などにすると、予想どおり -1 になります。

于 2012-10-02T15:11:32.033 に答える