[英]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.AvailableFreeSpace
為int
的第一種方法將不起作用,因為您嘗試轉換的數字164660715520
不適合32位。 您需要保持盡可能長的64位。
避免浮點運算的技巧是先乘以100
,然后進行除法。
只要數字乘以100
都在允許的大小范圍內(對於您而言,是這樣),結果就具有良好的精度:
label10.Text = ((100*dInfo.AvailableFreeSpace/dInfo.TotalSize)).ToString();
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.