在c#中划分2个long时获取值0

问题描述 投票:7回答:5

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

我需要结束值为int,因为progressbar.value需要一个int,上面的方法返回一个long。

我有这个值:

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的转换有关吗?

c# casting int long-integer
5个回答
18
投票

整数除法仅返回整数部分。因此3/5将为0.您需要将至少一个因子视为浮点数。试试这个:

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

10
投票

dInfo.AvailableFreeSpace立刻投射到int的第一种方法是行不通的,因为你试图施放的数字164660715520不适合32位。你需要尽可能长时间保持64位。

避免浮点算术的技巧是首先乘以100,然后进行除法。

只要100的数量在允许的大小范围内(在您的情况下,它是),结果具有良好的精度:

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

Demo on ideone (prints 64).

long total = 256058060800L;
long avail = 164660715520L;
var pct = (100*avail/total).ToString();
Console.WriteLine("{0}", pct); // 64

1
投票

使你的dInfo.AvailableFreeSpace和dInfo.TotalSize小数或双精度类型以避免强制转换或

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


1
投票

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

在乘以100之前投射为decimal类型

例如(在我计算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";                
        }
    }
}

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;
    }
© www.soinside.com 2019 - 2024. All rights reserved.