首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将double转换为UInt16

将double转换为UInt16
EN

Stack Overflow用户
提问于 2013-10-09 22:01:14
回答 1查看 2.1K关注 0票数 1

我正在编写一个函数,它允许用户传递一个双精度值,然后返回一个UInt16。

这是我的代码:

代码语言:javascript
复制
public static UInt16 Value_To_BatteryVoltage(double value)
    {
        var ret = ((int)value << 8); 
        var retMod = (value % (int)value) * 10; 
        return (UInt16)(ret + retMod);
    }

基本上,它的作用如下,函数调用:

代码语言:javascript
复制
Value_To_BatteryVoltage(25.10)

将返回: 6401

我可以通过执行以下操作来检查结果:

代码语言:javascript
复制
public static double VoltageLevel(UInt16 value)
    {
        return ((value & 0xFF00) >> 8) + ((value & 0x00FF) / 10.0);
    }

这是按预期工作的,但是,如果我这样做:

代码语言:javascript
复制
Value_To_BatteryVoltage(25.11) //notice the 0.11

我得到了错误的结果,因为:

代码语言:javascript
复制
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
    }

所以问题是,有没有某种方法可以在不损失精度的情况下进行这种转换?

EN

回答 1

Stack Overflow用户

发布于 2013-10-09 22:34:29

如果我理解这个问题,您希望将特征(整数部分)存储在UInt16的前8位中。以及第二个8比特中的尾数(小数部分)。

这是一种方法。我将双精度数视为字符串,并在小数点处将其拆分。例如:

代码语言:javascript
复制
    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);
    }

下面是输出:

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19274263

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档