我使用以下代码将字节转换为人类可读的文件大小。但 它没有给出准确的结果。
public static class FileSizeHelper
{
static readonly string[] SizeSuffixes = { "bytes", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB" };
public static string GetHumanReadableFileSize(Int64 value)
{
if (value < 0) { return "-" + GetHumanReadableFileSize(-value); }
if (value == 0) { return "0.0 bytes"; }
int mag = (int)Math.Log(value, 1024);
decimal adjustedSize = (decimal)value / (1L << (mag * 10));
return string.Format("{0:n2} {1}", adjustedSize, SizeSuffixes[mag]);
}
}
用法:
FileSizeHelper.GetHumanReadableFileSize(63861073920);
返回59.48 GB
但是,如果我使用谷歌转换器转换相同的字节,它会给63.8GB
知道代码中有什么问题吗?
Goolge截图:
@RenéVogt和@bashis感谢您的解释。最后使用以下代码
使其正常工作public static class FileSizeHelper
{
static readonly string[] SizeSuffixes = { "bytes", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB" };
const long byteConversion = 1000;
public static string GetHumanReadableFileSize(long value)
{
if (value < 0) { return "-" + GetHumanReadableFileSize(-value); }
if (value == 0) { return "0.0 bytes"; }
int mag = (int)Math.Log(value, byteConversion);
double adjustedSize = (value / Math.Pow(1000, mag));
return string.Format("{0:n2} {1}", adjustedSize, SizeSuffixes[mag]);
}
}
答案 0 :(得分:4)
关于如何显示字节总是有点混乱。如果结果是您想要实现的结果,那么您的代码是正确的。
您从Google展示的内容是十进制表示。正如您所说1000m = 1km
,您可以说1000byte = 1kB
。
另一方面,存在1k = 2^10 = 1024
的二进制表示。这些表示称为kibiBytes, Gibibytes etc。
您选择的代表取决于您或您客户的要求。只要明白你用来避免混淆。
答案 1 :(得分:2)