在C#中浮动到24位整数

时间:2018-05-18 09:06:10

标签: c#

不粘贴任何代码的道歉,因为我完全不知道如何去做。

我的应用程序将接收一个浮点变量fpanAngle,我需要将此值发送到另一个需要数据格式为24位整数的应用程序。

我需要将浮点值转换为24位整数。

其中零由080000十六进制表示。值的范围是-180.0 度(058730十六进制)到+180.0度(0A78D0十六进制)。

2 个答案:

答案 0 :(得分:1)

如果源范围[0x058730,0x0A78D0]线性映射到目标范围[-180.0,180.0],则很容易进行"翻译"。一些简单的数学就可以做到。

private const int minSrc = 0x058730;
private const int maxSrc = 0x0A78D0;
private const int rangeSrc = maxSrc - minSrc;
private const double minDest = -180.0;
private const double maxDest = 180.0;
private const double rangeDest = maxDest - minDest;

public static double Convert(int num)
{
    return ((num - minSrc) * rangeDest / rangeSrc) + minDest;
}

加上一些测试:

int[] nums = new[] { 0x058730, 0x080000, 0x0A78D0 };
double[] result = Array.ConvertAll(nums, Convert);

result是-180.0,0,180.0)

如果你需要整数result,你可以简单地投射它。

转换double - > int你可以:

public static int Convert2(double num)
{
    return (int)(((num - minDest) * rangeSrc / rangeDest) + minSrc);
}

试验:

int[] result2 = Array.ConvertAll(new[] { -180.0, 0, 180.0 }, Convert2);

答案 1 :(得分:0)

实际上,它并不那么难。你应该做的是:

  • 通过添加180将(-180.0,180.0)范围翻译为(0.0,360.0)。
  • 除以360以得到(0.0,1.0)范围。由于它是双倍的,所以不应该失去任何精度,但可以肯定的是,你可以在这之前做下一步。
  • 乘以整数范围。全部整数是您的最大值(0x0A78D0)减去最小值(0x058730),因此0x4F1A0。 (奇怪的是,这是小数324000.不知道为什么他们没有去360000)
  • 添加最小值(0x058730)。

这样,您最终会将双倍转换为请求范围内的整数值。

以下是代码中的处理过程:

public static Int32 DegreesToInt24(Double degrees)
{
    if (degrees > 180.0 || degrees < -180.0)
        throw new ArgumentOutOfRangeException("degrees");
    const Int32 bottom = 0x058730;
    const Int32 range = 0x4F1A0;
    return (Int32)((degrees + 180.0) * range / 360.0) + bottom;
}