1

如何在 Arduino 或 C 中将例如 30.8365146 转换为两个整数:30 和 8365146。

当我尝试通过不允许传输分数的 xbee 系列 1 发送 gps 数据时,我面临这个问题,所以我决定将数据分成两部分。我怎样才能做到这一点?

  double num=30.233;
  int a,b;
  a = floor(num); 
  b= (num-a) * pow(10,3);

输出:30 和 232 !!!输出不是 30 和 233 为什么以及如何修复它

  double num=30.2334567;
  int a,b;
  a = floor(num); 
  b= (num-a) * pow(10,7);

输出:30 和 32767 !!!

4

3 回答 3

0

您面临的似乎是一个双精度问题。您写入变量的数字不可表示,因此编译器采用最接近的数字。

你的算法是对的。

于 2013-03-13T19:00:49.053 回答
0

我将此发布到您对此提出的另一个问题 - 您需要一组小数位数。一个简单的功能将解决它。

#define PLACES 3

void extract(double x, int *a, int *b, int *n)
{
    char buf[PLACES+10];

    sprintf(buf, "%.*f", PLACES, x);
    sscanf(buf, "%d.%d", a, b);

    *n = (int) pow(10, PLACES);

    // integer part is a, fractional part b / n
}

例如

    extract(30.2334567, &a, &b, &n);
    printf("%d, %d, %d\n", a, b, n);

    -> 30, 233, 1000

PLACES如果您想改变精度,可以将其作为整数参数。

于 2013-03-13T19:08:29.880 回答
0

由于这个问题可能涉及舍入误差,正如其他答案所建议的那样,我建议先对浮点值进行乘法运算,然后再进行减法运算。例如,此代码产生了您正在寻找的输出:

int main() {
    double num = 30.233;
    int a,b;
    a = floor(num);
    b = num * pow(10,3) - a * pow(10,3);
    printf("%d",b);

    num = 30.2334567;
    a = floor(num);
    b = num * pow(10,7) - a * pow(10,7);
    printf("%d", b);

    return 0;
}  

输出:233 和 2334567

于 2013-03-13T19:21:39.210 回答