例如,在 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。为什么以及如何修复它?
例如,在 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 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 的幂并以整数形式发送。
您可以使用 sprintf 将整数输出到 char 数组,然后用'.'空格替换 并使用 sscanf 读回两个整数。
我这样做是为了浮动,使用 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。
如评论中所述,您需要跟踪小数位。您不能直接转换为整数。一些代码会做这样的事情:
#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
可以通过向下舍入(math.h 中的 floor(x))来提取 30。
小数点后面的数字有点棘手,因为该数字很可能在内部存储为二进制数,这可能无法很好地转换为您要查找的数字,尤其是在涉及浮点数学的情况下。您最好的选择可能是将数字转换为字符串,然后从该字符串中提取数据。
使用 floor() 获取整数值和 num % 1 (模运算)获取小数部分怎么样?
然后你可以将小数部分乘以 10 的倍数并四舍五入。这也可以让您控制您发送的小数位数,如果这在您的通讯中是有限的。标准。
那行得通吗?
#include <math.h>
integer_part = floor(num);
decimal_part = fmod(num,1)*10^whatever;