我正在编写一个函数,它允许用户传递一个双精度值,然后返回一个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
}所以问题是,有没有某种方法可以在不损失精度的情况下进行这种转换?
发布于 2013-10-09 22:34:29
如果我理解这个问题,您希望将特征(整数部分)存储在UInt16的前8位中。以及第二个8比特中的尾数(小数部分)。
这是一种方法。我将双精度数视为字符串,并在小数点处将其拆分。例如:
public static UInt16 Value_To_BatteryVoltage(double value)
{
string[] number = value.ToString().Split('.');
UInt16 c = (UInt16)(UInt16.Parse(number[0]) << 8);
UInt16 m = UInt16.Parse(number[1]);
return (UInt16)(c + m);
}下面是输出:

https://stackoverflow.com/questions/19274263
复制相似问题