如何获得一个十进制数为Arduino的或C两个整数的整数和小数部分?(How to get the

2019-07-21 12:52发布

如何转换成30.8365146两个整数,30和8365146,例如,在Arduino的或C?

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

我已经试过这样的事情:

double num=30.233;
int a,b;

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

输出是30232 ! 输出不是30和233为什么,我该如何解决?

Answer 1:

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一些力量,只是乘以你的电话号码,并发送一个整数。



Answer 2:

可以使用输出sprintf的整数到字符数组,则更换'.' 用一个空格和使用sscanf的回读两个整数。



Answer 3:

我是做花车,采用双层临时:

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);
}

我想,你可以使用四倍精度浮点格式,以实现双重一样: libquadmath 。



Answer 4:

The 30 can just be extracted by rounding down (floor(x) in math.h).

The numbers behind the decimal point are a bit more tricky, since the number is most likely stored as a binary number internally, this might not translate nicely into the number you're looking for, especially if floating point-math is involved. You're best bet would probably be to convert the number to a string, and then extract the data from that string.



Answer 5:

正如评论,你需要跟踪的小数位。 你不能这样做的直接转换为整数。 代码位会做这样的事情:

#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


Answer 6:

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

然后,你可以通过10和圆形的倍数乘以小数部分。 这也将让你掌控你有多少位小数发送,如果在你的通讯受到限制。 标准。

将这项工作?

#include <math.h>

integer_part = floor(num); 
decimal_part = fmod(num,1)*10^whatever;


文章来源: How to get the integer and fractional part of a decimal number as two integers in Arduino or C?