4

以下に、インターネットから検索して、C#でExcelのパーセントランク関数を計算する方法を示します。プログラムに合わせて少し変更しましたが、メインロジックは変更しませんでした。

プログラムはコンパイルされ、エラーなしで正常に実行されます(私が知っていることです)。ただし、コードをさらに確認すると、メインでは、を使用して関数を呼び出します

        double result = percentRank( array, x); 

どこ

xはint
配列であり、リスト(int)です。

これは、percentRankメソッドが取るように指定されているものとは異なるタイプですが、それでも正常に実行されます。私の質問はなぜですか?

        private static double percentRank(List<int> array, double x)
        {
            //        Calculate the PERCENTRANK(array, x)
            //If X matches one of the values in the array, this function is
            //equivalent to the Excel formula =(RANK(x)-1)/(N-1) where N is the number of data points.
            //If X does not match one of the values, then the PERCENTRANK function interpolates.
            // http://www.pcreview.co.uk/forums/algorithm-computing-excel-percentrank-t946312.html


            array.Sort();

            double result = 0;
            bool foundX = false;

            for (int index = 0; index < array.Count; index++)
            {
                if (array[index] == x)
                {
                    result = ((double)index) / ((double)array.Count - 1);
                    foundX = true;
                    break;
                }
            }
            // calculate value using linear interpolation

            if (foundX == false)
            {
                double x1, x2, y1, y2;

                x1 = x2 = x;

                for (int i = 0; i < array.Count - 1; i++)
                {
                    if (array[i] < x && x < array[i + 1])
                    {
                        x1 = array[i];
                        x2 = array[i + 1];
                        foundX = true;
                        break;
                    }
                }

                if (foundX == true)
                {
                    y1 = percentRank(array, x1);
                    y2 = percentRank(array, x2);

                    result = (((x2 - x) * y1 + (x - x1) * y2)) / (x2 - x1);
                }
                else
                {
                    // use the smallest or largest value in the set which ever is closer to valueX

                    if (array[0] > x)
                    {
                        result = 0;
                    }
                    else
                    {
                        result = 1;
                    }
                }
            }

            return result;
        }

編集:OK答えは暗黙の型変換です。無効にできますか?気づいていないバグが発生する可能性があるので、気に入らない。

4

4 に答える 4

11

私の質問はなぜですか?

double値に整数を割り当てることができます。Int32C#は暗黙的にからに変換しDoubleます。

あなたはここでこれを見ることができます:

double value = 3;

これは、同じ暗黙の変換のために許可されます。その変換がなければ、次のように入力する必要があります。

double value = 3.0;

これは、C#言語仕様のセクション「6.1.2暗黙的な数値変換」で指定されています。

暗黙の数値変換は次のとおりです。

..。

  • intからlong、float、double、またはdecimalまで。
于 2012-09-27T17:46:21.837 に答える
2

C#コンパイラは、暗黙的なキャスト操作を実行しています。doubleは、任意の整数値を保持できます。

于 2012-09-27T17:46:38.283 に答える
1

からへのimplicit変換があります。intdouble

doubleは精度を失うことなくintの値を保持できるため、変換は暗黙的です。

explicitdoubleからintへの変換はありますが、変換はありませんimplicit。その理由は、doubleをintに格納すると、小数点以下を切り捨てると値が失われるためです。

MSDNには、変換に関する優れた記事があります: http ://msdn.microsoft.com/en-us/library/ms173105.aspx

于 2012-09-27T17:47:02.643 に答える
0

int暗黙的ににキャストできますdouble。それがここで起こっていることです。

于 2012-09-27T17:47:05.800 に答える