[英]Convert double to UInt16
我正在制作一個函數,該函數將允許用戶傳遞一個雙精度值,然后返回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
}
所以問題是,是否有某種方法可以進行這種轉換而又不損失精度?
如果我理解這個問題,則要將特征(整數部分)存儲在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);
}
這是輸出:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.