14

我正在尝试划分 DriveInfo.AvailableFreeSpace 和 DriveInfo.TotalSize 的值以尝试获取它的百分比以在进度条中使用。

我需要最终值是一个 int,因为 progressbar.value 需要一个 int 并且上述方法返回一个 long。

我有这个作为价值观:

164660715520---可用空闲空间

256058060800---总尺寸

当我尝试使用此方法设置 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。您需要将至少一个因素视为浮点数。试试这个:

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

dInfo.AvailableFreeSpace立即转换的第一种方法int行不通,因为164660715520您尝试转换的数字不适合 32 位。您需要尽可能保持 64 位。

避免浮点运算的诀窍是先乘以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

该值向下舍入为 0,因为long类型不能有小数位,只能有整数。

decimal在乘以 100 之前转换为类型

例如(在我计算 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 十进制或双精度类型以避免强制转换或

采用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 回答