簡體   English   中英

將double轉換為UInt16

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM