Ответ 1
Помните, что в 2 байтах вы можете иметь только 4 полных цифры + знак, а в 4 байтах вы можете иметь только 9 цифр + знак, поэтому мне пришлось масштабировать ваши предварительные требования соответственно.
public static byte[] SerializeLong2Dec(double value)
{
value *= 100;
value = Math.Round(value, MidpointRounding.AwayFromZero);
if (value < -999999999.0 || value > 999999999.0)
{
throw new ArgumentOutOfRangeException();
}
int value2 = (int)value;
return BitConverter.GetBytes(value2);
}
public static double DeserializeLong2Dec(byte[] value)
{
int value2 = BitConverter.ToInt32(value, 0);
return (double)value2 / 100.0;
}
public static byte[] SerializeLong1Dec(double value) {
value *= 10;
value = Math.Round(value, MidpointRounding.AwayFromZero);
if (value < -999999999.0 || value > 999999999.0) {
throw new ArgumentOutOfRangeException();
}
int value2 = (int)value;
return BitConverter.GetBytes(value2);
}
public static double DeserializeLong1Dec(byte[] value) {
int value2 = BitConverter.ToInt32(value, 0);
return (double)value2 / 10.0;
}
public static byte[] SerializeShort2Dec(double value) {
value *= 100;
value = Math.Round(value, MidpointRounding.AwayFromZero);
if (value < -9999.0 || value > 9999.0) {
throw new ArgumentOutOfRangeException();
}
short value2 = (short)value;
return BitConverter.GetBytes(value2);
}
public static double DeserializeShort2Dec(byte[] value) {
short value2 = BitConverter.ToInt16(value, 0);
return (double)value2 / 100.0;
}
public static byte[] SerializeShort1Dec(double value) {
value *= 10;
value = Math.Round(value, MidpointRounding.AwayFromZero);
if (value < -9999.0 || value > 9999.0) {
throw new ArgumentOutOfRangeException();
}
short value2 = (short)value;
return BitConverter.GetBytes(value2);
}
public static double DeserializeShort1Dec(byte[] value) {
short value2 = BitConverter.ToInt16(value, 0);
return (double)value2 / 10.0;
}
Итак, ясно, что диапазон (подписанных) коротких (16 бит) составляет -32,768 до 32,767, поэтому совершенно ясно, что у вас есть только 4 полных цифры плюс небольшая часть (0-3), диапазон (подписанный) int (32 бита) составляет -2147,483,648 до 2,147,483,647, поэтому совершенно ясно, что у вас есть только 9 полных цифр плюс небольшая часть (0-2). Подойдя к (подписанному) длинному (64 бита), у вас есть -9,223,372,036,854,775,808 до 9,223,372,036,854,775,807, так что 18 цифр плюс (большая) часть. Используя плавающие точки, вы теряете точность. Поплавок (32 бит) имеет точность около 7 цифр, а двойная (64 бит) имеет точность около 15-16 цифр.