class FixVal{
const int total_bit_cnt = 64;
const int f_bit_cnt = 16;
const int i_bit_cnt = total_bit_cnt - f_bit_cnt;
const long f_mask = (long)(ulong.MaxValue >> i_bit_cnt);
const long i_mask = (long)(-1L & ~f_mask);
const long f_range = f_mask + 1;
public const long min_val = long.MinValue >> f_bit_cnt;
public const long max_val = long.MaxValue >> f_bit_cnt;
long mRaw;
public FixVal(int intVal):this(((long)intVal) << f_bit_cnt){
}
public FixVal(long raw){
mRaw = raw;
}
public long GetRaw(){
return mRaw;
}
public static FixVal operator +(FixVal a, FixVal b){
return new FixVal(a.mRaw + b.mRaw);
}
public static FixVal operator -(FixVal a, FixVal b){
return new FixVal(a.mRaw - b.mRaw);
}
public static FixVal operator *(FixVal a, FixVal b){
return new FixVal((a.mRaw * b.mRaw + (f_range >> 1)) >> f_bit_cnt);
}
public static FixVal operator /(FixVal a, FixVal b){
return new FixVal((a.mRaw << f_bit_cnt) / b.mRaw);
}
public static explicit operator double (FixVal fixVal){
return (double)(fixVal.mRaw >> f_bit_cnt) + (fixVal.mRaw & f_mask) / (double)f_range;
}
}
测试结果
测试代码
FixVal a = new FixVal(35532);
FixVal b = new FixVal(5);
FixVal c = a / b;
Console.WriteLine(c.GetRaw());
double d = (double)c;
Console.WriteLine(d);
Console.WriteLine(35532f / 5f);