Cam*_*ker 1 c# math unit-conversion
我创建了做单位转换类,具体字节来千字节,兆字节,千兆,等我有一个enum带B通过PB,但由于某种原因1024^0不返回1,它不是正确地从字节转换为字节或字节为千字节,等等.
这是我的班级:
public static class UnitConversion
{
/// <summary>
/// 1024^n
/// </summary>
public enum ByteConversionConstant
{
B = 0,
KB = 1,
MB = 2,
GB = 3,
TB = 4,
PB = 5
}
public static string GetValueFromBytes(long bytes,
ByteConversionConstant constant)
{
int n = (int)constant;
long divisor = 1024^n;
return (bytes / divisor).ToString() +
Enum.GetName(typeof(ByteConversionConstant), constant);
}
}
Run Code Online (Sandbox Code Playgroud)
以下语句应返回与之完全相同的值fileInfo.Length,但由于1024^0未返回1,因此它显示的是千字节数.注意,我将GetValueFromBytes方法全部放在一行中,但是我把它分开来看看可能导致错误计算的原因.
UnitConversion.GetValueFromBytes(fileInfo.Length,
UnitConversion.ByteConversionConstant.B)
Run Code Online (Sandbox Code Playgroud)
我不确定这是一个问题,如果enum把一个int东西弄到一个或者当一个东西在一个东西上升int到一个int并分配给它时会丢失long,但这是一种奇怪的行为.
Jon*_*eet 15
您正在使用的^运营商,这是不是一个幂运算符.它是异或的.
使用Math.Pow乘方-或更好,只是使用位移位在这种情况下:
long divided = bytes >> (n * 10);
return divided.ToString() + ...;
Run Code Online (Sandbox Code Playgroud)
或者,您可以将枚举值更改为实际值除以:
public enum ByteConversionConstant : long
{
B = 1L << 0,
KB = 1L << 10,
MB = 1L << 20,
GB = 1L << 30,
TB = 1L << 40,
PB = 1L << 50
}
Run Code Online (Sandbox Code Playgroud)
然后:
long divided = n / (long) constant;
Run Code Online (Sandbox Code Playgroud)