private void OnGroupDownloadProgressed(object sender, IEnumerable<DownloadItem> items)
{
Invoke(new MethodInvoker(() =>
{
long chunksSummarySize = items.Select(item => item.ChunkSize).Sum();
long downloaded = items.Select(item => item.DownloadedSize).Sum();
if (chunksSummarySize > 0L)
{
double percent = 100.0 / chunksSummarySize * downloaded;
string percentFormatted = string.Format("{0:F2}", percent);
lblGroupProgress.Text = $"Скачано: {FormatSize(downloaded)} / {FormatSize(chunksSummarySize)} ({percentFormatted}%)";
}
else
{
lblGroupProgress.Text = "Подключение...";
}
LinkedList<MultipleProgressBarItem> list = new LinkedList<MultipleProgressBarItem>();
foreach (DownloadItem item in items)
{
double percent = 100.0 / item.ChunkSize * item.DownloadedSize;
string percentFormatted = string.Format("{0:F2}", percent);
string itemText;
switch (item.State)
{
case DownloadItemState.Connecting:
itemText = $"{item.VodChunk.FileName}: Connecting...";
break;
case DownloadItemState.Downloading:
case DownloadItemState.Finished:
case DownloadItemState.Errored:
itemText = $"{item.VodChunk.FileName}: " +
$"{FormatSize(item.DownloadedSize)} / {FormatSize(item.ChunkSize)} ({percentFormatted}%)";
break;
default:
itemText = null;
break;
}
int percentRounded = (int)Math.Floor(percent);
if (item.DownloadedSize == item.ChunkSize && percentRounded == 99)
{
string t = $"{item.DownloadedSize} / {item.ChunkSize} | {percent} | {percentRounded}\n{itemText}";
System.Diagnostics.Debug.WriteLine(t);
}
MultipleProgressBarItem mpi = new MultipleProgressBarItem(
0, 100, percentRounded, itemText, Color.Lime);
list.AddLast(mpi);
}
multipleProgressBarGroup.SetItems(list);
}));
}
Иногда срабатывает вот это условие:
if (item.DownloadedSize == item.ChunkSize && percentRounded == 99)
{
string t = $"{item.DownloadedSize} / {item.ChunkSize} | {percent} | {percentRounded}\n{itemText}";
System.Diagnostics.Debug.WriteLine(t);
}
и в консоль выводится это:
Не пойму почему Там же ровно 100, а не 99,999999999999
.
Я знаю, что операции над числами с плавающей запятой не идеально точные. Но если они прям настолько не точные, на кой тогда хранить все эти 16 (или сколько их там) знаков после запятой?