如何以数学方式表达这个功能

时间:2017-08-28 14:07:58

标签: c# algorithm math

你如何用C#表示这个循环作为数学表达式?

private string FormatBytes(long bytes)
{
    string[] Suffix = { "B", "KB", "MB", "GB", "TB" };
    int i;
    double dblSByte = bytes;
    for (i = 0; i < Suffix.Length && bytes >= 1024; i++, bytes /= 1024)
    {
        dblSByte = bytes / 1024.0;
    }

    return String.Format("{0:0.##} {1}", dblSByte, Suffix[i]);
}

1 个答案:

答案 0 :(得分:1)

您可以通过首先计算最接近的1024次幂来计算数值:

int power = (int) Math.Log(bytes, 1024)

然后你可以将这个数字限制为后缀的数量,这样你就不会超过数组的末尾:

int power = Math.Min(Suffix.Length-1, (int) Math.Log(bytes, 1024));

然后你根据这个力量找出你应该划分原始数字的东西:

double div = Math.Pow(1024, power);

然后,您可以使用指定功率1024的后缀格式化字符串:

return string.Format("{0:f1}{1}", bytes / div, Suffix[power]);

将所有这些放在一起(并将“PB”投入数PB):

private string FormatBytes(long bytes)
{
    string[] Suffix = { "B", "KB", "MB", "GB", "TB", "PB" };
    int power = Math.Min(Suffix.Length-1, (int) Math.Log(bytes, 1024));
    double div = Math.Pow(1024, power);

    return string.Format("{0:f1}{1}", bytes / div, Suffix[power]);
}

瞧瞧!在不使用循环的情况下以数学方式计算。

(我敢打赌,这比循环的速度快得多......)

如果你愿意,你可以扩展后缀数组以包含“exobyte”,然后它可以很好地工作到int.MaxValue,即8.0EB。