簡體   English   中英

在C#中除以2個long時獲得0值

[英]Getting a value of 0 when dividing 2 longs in c#

我正在嘗試將DriveInfo.AvailableFreeSpace和DriveInfo.TotalSize的值相除,以嘗試獲取進度條中要使用的百分比。

我需要最終值是一個整數,因為progressbar.value需要一個整數,並且上述方法返回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的轉換有關嗎?

整數除法僅返回整數部分。 因此3/5將為0。您需要將至少一個因子視為浮點數。 嘗試這個:

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

立即將dInfo.AvailableFreeSpaceint的第一種方法將不起作用,因為您嘗試轉換的數字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

該值四舍五入為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";                
        }
    }
}

使您的dInfo.AvailableFreeSpace和dInfo.TotalSize為小數或雙精度類型,以避免強制轉換或

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

我可能有點晚了,但是在嘗試比較時間跨度時遇到了這個問題。 最終,我將每個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;
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM