ユーザーが double 値を渡してから UInt16 を返すことができるようにする関数を作成しています。
これは私のコードです:
public static UInt16 Value_To_BatteryVoltage(double value)
{
var ret = ((int)value << 8);
var retMod = (value % (int)value) * 10;
return (UInt16)(ret + retMod);
}
基本的には、関数呼び出しは次のとおりです。
Value_To_BatteryVoltage(25.10)
戻ります: 6401
次のようにして結果を確認できます。
public static double VoltageLevel(UInt16 value)
{
return ((value & 0xFF00) >> 8) + ((value & 0x00FF) / 10.0);
}
これは期待どおりに機能していますが、次のようにします。
Value_To_BatteryVoltage(25.11) //notice the 0.11
次の理由により、間違った結果が得られます。
public static UInt16 Value_To_BatteryVoltage(double value)
{
var ret = ((int)value << 8); // returns 6400 OK
var retMod = (value % (int)value) * 10; //returns 0.11 x 10 = 1.1 WRONG!
return (UInt16)(ret + retMod); //returns 6400, because (UInt16)(6400 + 1.1) = 6401 same as 25.10 so I've lost precision
}
問題は、精度を失うことなくこの種の変換を行う方法があるかどうかです。