我正在制作一个允许用户传递双精度值,然后返回 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
}
所以问题是,有没有办法在不损失精度的情况下进行这种转换?