4

Windows、C#、VS2010。

私のアプリには次のコードがあります:

int[,] myArray=new int[10,2];
int result=0;
int x=0;
x++;

以下のように、結果が 10.0001 から 10.9999 の間の場合。結果=10

result= (myArray[x,0]+myArray[x+1,0])/(x+1); 

私はこれが必要です: 結果>=10&&result<10.5 が 10 に丸められる場合。

以下のコードを試してください。しかし、うまくいきませんでした。

result= Math.Round((myArray[x,0]+myArray[x-1,0])/(x+1));

エラー: 次のメソッドまたはプロパティの呼び出しがあいまいです: 'System.Math.Round(double)' と 'System.Math.Round(decimal)'

エラー: タイプ 'double' を 'int' に暗黙的に変換することはできません。明示的な変換が存在します (キャストがありませんか?)

result= Convert.ToInt32(Math.Round((myArray[x,0]+myArray[x-1,0])/(x+1)));

エラー: 次のメソッドまたはプロパティの呼び出しがあいまいです: 'System.Math.Round(double)' と 'System.Math.Round(decimal)'

前もってありがとう、ocaccy pontes。

4

2 に答える 2

7

試す

result= (int)Math.Round((double)(myArray[x,0]+myArray[x-1,0])/(x+1));

これにより、コンパイラ エラーが解消されるはずです。

最初のもの (「エラー: 次のメソッドまたはプロパティの間で呼び出しがあいまいです: 'System.Math.Round(double)' と 'System.Math.Round(decimal)'」) は、被除数を , に変換することによって解決されますdouble。これは、精度の低下を避けるために、除算の出力になるように「細流化」します。double

double同じ効果を得るために、関数の引数を明示的に に変換することもできます。

Math.Round((double)((myArray[x,0]+myArray[x-1,0])/(x+1)));

(括弧の位置に注意してください)。

2 番目のエラー (「エラー: 型 'double' を 'int' に暗黙的に変換できません。明示的な変換が存在します (キャストがありませんか?)」) は、 の戻り値を に明示的に変換することで修正されMath.Roundますint

于 2013-04-30T02:54:56.627 に答える
0

これは3年前の質問であることは知っていますが、この回答はうまくいくようです。たぶん、誰かがこれらの価値のある拡張メソッドを見つけるでしょう。

// Invalid for Dividend greater than 1073741823.
public static int FastDivideAndRoundBy(this int Dividend, int Divisor) {
    int PreQuotient = Dividend * 2 / Divisor;
    return (PreQuotient + (PreQuotient < 0 ? -1 : 1)) / 2;
}

// Probably slower since conversion from int to long and then back again.
public static int DivideAndRoundBy(this int Dividend, int Divisor) {
    long PreQuotient = (long)Dividend * 2 / Divisor;
    return (int)((PreQuotient + (PreQuotient < 0 ? -1 : 1)) / 2);
}
于 2016-12-10T17:29:23.353 に答える