如何在arduino中将int的part部分和part部分转换为两个整数

时间:2013-03-13 18:48:59

标签: c int double arduino

如何将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 !!!

3 个答案:

答案 0 :(得分:0)

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

你的算法是对的。

答案 1 :(得分: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
}

e.g。

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

    -> 30, 233, 1000

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

答案 2 :(得分: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