2

例如,在 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);

输出是30232!输出不是 30 和 233。为什么以及如何修复它?

4

6 回答 6

3
double value = 30.8365146;
int left_part, right_part;
char buffer[50];
sprintf(buffer, "%lf", value);
sscanf(buffer, "%d.%d", &left_part, &right_part);

你会得到左/右部分分别存储在整数中。

PS 另一种解决方案是将您的数字乘以 10 的幂并以整数形式发送。

于 2013-03-13T13:44:05.497 回答
2

您可以使用 sprintf 将整数输出到 char 数组,然后用'.'空格替换 并使用 sscanf 读回两个整数。

于 2013-03-13T13:44:10.340 回答
1

我这样做是为了浮动,使用 double 作为临时:

int fract(float raw) {

    static int digits = std::numeric_limits<double>::digits10 - std::numeric_limits<float>::digits10 - 1;
    float intpart;
    double fract = static_cast<double>(modf(raw, &intpart));
    fract = fract*pow(10, digits - 1);
    return floor(fract);
}

我想你可以使用四精度浮点格式来实现同样的 double: libquadmath

于 2016-11-22T09:30:42.357 回答
0

如评论中所述,您需要跟踪小数位。您不能直接转换为整数。一些代码会做这样的事情:

#include <stdio.h>
#include <math.h>

#define PLACES 3

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

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

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

        printf("Number           : %.*f\n", PLACES, x);
        printf("  Integer        : %d\n", a);
        printf("  Fractional part: %d over %d\n", b, n);
}

int main()
{
        extract(1.1128);
        extract(20.0);
        extract(300.000512);
}

产生:

Number           : 1.113
  Integer        : 1
  Fractional part: 113 over 1000
Number           : 20.000
  Integer        : 20
  Fractional part: 0 over 1000
Number           : 300.001
  Integer        : 300
  Fractional part: 1 over 1000
于 2013-03-13T15:04:51.117 回答
0

可以通过向下舍入(math.h 中的 floor(x))来提取 30。

小数点后面的数字有点棘手,因为该数字很可能在内部存储为二进制数,这可能无法很好地转换为您要查找的数字,尤其是在涉及浮点数学的情况下。您最好的选择可能是将数字转换为字符串,然后从该字符串中提取数据。

于 2013-03-13T13:46:00.247 回答
0

使用 floor() 获取整数值和 num % 1 (模运算)获取小数部分怎么样?

然后你可以将小数部分乘以 10 的倍数并四舍五入。这也可以让您控制您发送的小数位数,如果这在您的通讯中是有限的。标准。

那行得通吗?

#include <math.h>

integer_part = floor(num); 
decimal_part = fmod(num,1)*10^whatever;
于 2013-03-13T17:29:12.237 回答