3桁をBCDに格納し、残りの4ビットを小数点位置に使用できます。
52.1 = 521 * 10 ^ -1 => 0x1521
1.25 = 125 * 10 ^ -2 => 0x2125
これにより、0.0000000000000001から999の範囲が得られます。もちろん、小数点のオフセットを追加して、たとえば0.0000000001から999000000の範囲を取得することもできます。
小数点の配置に使用される4ビットと、値に使用される残りのビットの単純な実装。エラーチェックなしで、徹底的にチェックされていません。!=
( doubleを比較するために使用する場合、一部の値で精度の問題が発生する可能性があります。)
public static short Encode(double value) {
int cnt = 0;
while (value != Math.Floor(value)) {
value *= 10.0;
cnt++;
}
return (short)((cnt << 12) + (int)value);
}
public static double Decode(short value) {
int cnt = value >> 12;
double result = value & 0xfff;
while (cnt > 0) {
result /= 10.0;
cnt--;
}
return result;
}
例:
Console.WriteLine(Encode(52.1));
Console.WriteLine(Decode(4617));
出力:
4617
52.1