14

DriveInfo.AvailableFreeSpaceとDriveInfo.TotalSizeの値を分割して、プログレスバーで使用するパーセンテージを取得しようとしています。

progressbar.valueにはintが必要であり、上記のメソッドはlongを返すため、終了値をintにする必要があります。

私はこれを値として持っています:

164660715520 --- AvailableFreeSpace

256058060800 --- TotalSize

このメソッドを使用してprogressbar.valueを設定しようとすると、エラーも発生します。

progressBar1.Value =(int)(dInfo.AvailableFreeSpace / dInfo.TotalSize)* 100;

このコードを使用して値を取得しようとすると、0が返されます。

label10.Text =  (((int)dInfo.AvailableFreeSpace/dInfo.TotalSize)*100).ToString();

私もこれを試しましたが、機能しません:

label10.Text = ((dInfo.AvailableFreeSpace/dInfo.TotalSize)*100).ToString();

見栄えを良くするためにまだフォーマットを行う必要があることはわかっていますが、コードを実行すると0が返されます。

longからintへの変換と関係がありますか?

4

5 に答える 5

25

整数除算は整数部分のみを返します。したがって、3/5は0になります。少なくとも1つの要素を浮動小数点数として扱う必要があります。これを試して:

label10.Text =  (((int)((double)dInfo.AvailableFreeSpace/dInfo.TotalSize)*100)).ToString();
于 2012-09-23T14:08:04.137 に答える
16

キャストしようとしている数が32ビットに収まらないため、すぐにキャストdInfo.AvailableFreeSpaceする最初の方法は機能しません。できる限り64ビットのままにする必要があります。int164660715520

浮動小数点演算を回避する秘訣は、100最初に乗算してから除算を行うことです。

回数100が許可されたサイズの範囲内である限り(そしてあなたの場合はそうです)、結果は優れた精度を持ちます。

label10.Text = ((100*dInfo.AvailableFreeSpace/dInfo.TotalSize)).ToString();

ideoneのデモ(64を印刷)。

long total = 256058060800L;
long avail = 164660715520L;
var pct = (100*avail/total).ToString();
Console.WriteLine("{0}", pct); // 64
于 2012-09-23T14:09:18.650 に答える
5

longタイプは小数点以下の桁数を持てず、整数のみであるため、値は0に切り捨てられます。

decimal100を掛ける前に型としてキャストする

例(ProgressBarの進捗率を計算している場合):

double someVariable =(double)longVariable1 /(double)longVariable2;

コードを以下に示します。

public partial class Form1 : Form
{
   public Form1()
    {
         web.ProgressChanged += new WebBrowserProgressChangedEventHandler(web_ProgressChanged);
    }

private void web_ProgressChanged(object sender, WebBrowserProgressChangedEventArgs e)
    {

        <strong>double t = (100 * (double)e.CurrentProgress / (double)e.MaximumProgress);</strong>
        if (t < 0)
            return;
        int c = (int)t;
        progressBar.Value = c;

        if (c == 100)
        {
            label1.Text = "Done";                
        }
    }
}
于 2012-09-23T14:08:17.100 に答える
1

キャストを避けるために、dInfo.AvailableFreeSpaceおよびdInfo.TotalSizeを10進数またはdouble型にします。または

使用するlabel10.Text = (((double)dInfo.AvailableFreeSpace/dInfo.TotalSize)*100).ToString();

于 2012-09-23T14:13:09.170 に答える
0

少し遅れるかもしれませんが、タイムスパンを比較しようとしたときにこの問題が発生しました。最終的に、各 timepsan を文字列にキャストし、比率を手動で計算しました

    private static double Improvement(string efficientTime, string inefficientTime)
    {
        var magnitude = Math.Pow(10, (inefficientTime.Length - efficientTime.Length));
        var time2 = (double) Convert.ToInt32(efficientTime.Substring(0, 5));
        var time1 = (double) Convert.ToInt32(inefficientTime.Substring(0, 5));
        var sigRatio = (time2 / time1);

        var sigPercent = sigRatio * magnitude;

        var improvement = sigPercent;
        return improvement;
    }
于 2017-12-27T21:46:03.663 に答える