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