0

2 つの値のパーセンテージを計算しようとしています。これは本当に単純なはずですが、奇妙な理由で機能していません。私は疲れすぎて/頭がおかしいので理解できません。これが私のコードです。0 を返し続けます。デバッグ中に値を確認しました。

private int CalculatePercentComplete(int FilesCompleted, int TotalFilesCount)
        {
            int returnvalue = (FilesCompleted / TotalFilesCount) * 100;

            if (returnvalue > 100 || returnvalue < 1) return 1;
            else return returnvalue;
        }
4

4 に答える 4

12

デバッグ中に値を確認し、FilesCompleted が 295 で、TotalFilesCount が 25002 の場合、戻り値 var はちょうど 0 です。既に 1 になっているはずです。

いいえ、すべての演算は整数で行われているためです。したがって、最初にこの式が評価されます。

(FilesCompleted / TotalFilesCount)

それは 295 / 25002 です。その整数演算の結果は 0 です...そして、それを 100 で乗算すると、まだ0 になります。最も簡単な修正は、最初に乗算を行うことです:

int returnvalue = (FilesCompleted * 100) / TotalFilesCount;

FilesCompletedより大きい場合はオーバーフローすることに注意してくださいint.MaxValue / 100。浮動小数点演算ですべてを行うことで、これを修正できます。

int returnvalue = (int)((FilesCompleted * 100.0) / TotalFilesCount);

... またはlong整数演算を使用して:

int returnvalue = (int)((FilesCompleted * 100L) / TotalFilesCount);

もちろん、非常に多くのファイルが必要でない場合は、どちらも必要ありません。(4200万ファイルまでは大丈夫です...)

補足として、パラメーター名は .NET 命名規則に違反しています。それらは camelCased である必要があります -totalFilesCountおよびfilesCompleted.

于 2012-09-08T07:54:10.847 に答える
2

どうですか

int returnvalue = (int)(((double)FilesCompleted / TotalFilesCount) * 100);

これは何をしているのか

  1. ファイルの変換intが に完了しましたdouble。たとえば、295 の場合、これは 295.0 に変換されるため、除算は double で行われます。

    TotalFilesCountdouble を integer で除算 (または integer を double で除算) すると double が返されるため、doubleに変換する必要もありません。

  2. したがって、返される double の結果は 0.011799056075513958 で、これに 100 が掛けられます

  3. したがって、返される結果は 1.1799056075513958 であり、最終的に 1 を返す int に変換されます

于 2012-09-08T07:56:09.630 に答える
1

確かに、単純なエラーです。int で迂回を行うと、答えは int になります。あなたの答えは 0 から 1 の間になるので、切り捨てて 0 (整数) になります。

使用する:

int returnvalue = (int)((FilesCompleted / (double)TotalFilesCount) * 100);

計算を行うには、分数に double を使用し、それを 100 倍して int にキャストします。

于 2012-09-08T07:55:43.040 に答える
1

FilesCompleted/TotalFilesCountint 形式では 0 である 0.01 を返しFilesCompleted*100/TotalFilesCountます。

于 2012-09-08T07:57:06.037 に答える