【问题标题】:how to convert int part and fraction part of a double into two integers in arduino [duplicate]如何在arduino中将double的int部分和小数部分转换为两个整数[重复]
【发布时间】:2013-03-13 18:48:59
【问题描述】:

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

【问题讨论】:

  • 你应该首先确定你想把多少小数点变成整数。否则你得不到你想要的。即 1.30 应该返回与 1.3 相同的两个整数。
  • 我已经通过将第一个示例中的分数乘以 10^3 和第二个示例中的分数乘以 10^7 来定义我想要的小数位数
  • 这样做你会遇到小数精度的小问题,此外......如果你输入一个数字 30.2330000 和 30.233,你怎么知道乘以 10^3 和 10^7?答案是你可以知道,但程序不会知道,因为对程序来说每个数字都是一样的。
  • 在我的情况下这不是问题,因为我知道来自 gps 的数据我总是 7 个小数点
  • 如果你知道它总是 7 那么你永远不会这样做*pow(10,3)

标签: c int double arduino


【解决方案1】:

由于这个问题可能涉及舍入误差,正如其他答案所建议的那样,我建议先对浮点值进行乘法运算,然后再进行减法运算。例如,此代码产生了您正在寻找的输出:

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

【讨论】:

  • @A Stidham : 你能告诉我 printf("%d", b); 的功能是什么吗?返回0;因为我在没有它们的情况下尝试了代码并且输出是正确的,除了输出的最后一位数字:233 和 2334560
  • @A Stidham :如果 num= 30.233456 它可以正常工作,则该代码适用于小于七位数的任何小数位
  • @Abdelrahman Tarief:函数 printf("%d", b) 将变量 b 的值打印到控制台。我包含它只是为了在我的测试程序中验证我的算法。至于return 0,表示我的测试程序的main方法退出无误,不需要程序运行。
  • @Abdelrahman Tarief:这是一个有用的链接,解释了 printf 函数及其格式说明符,即 %d、%f 等。codingunit.com/…
  • @A Stidham : 所以你不知道为什么第七位数字有错误,而代码在 6 位数字下可以正常工作
【解决方案2】:

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

你的算法是对的。

【讨论】:

    【解决方案3】:

    我将此发布到您对此提出的另一个问题 - 您需要一组小数位数。一个简单的函数就可以解决了。

    #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
    }
    

    例如

        extract(30.2334567, &a, &b, &n);
        printf("%d, %d, %d\n", a, b, n);
    
        -> 30, 233, 1000
    

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

    【讨论】:

    • 我试过 x=30.2334567 并且输出是 0 和 14336 注意:我把代码复制粘贴 :)
    • @AbdelrahmanTarief:它会自动将浮点数四舍五入到PLACES 小数位。请记住,您需要n,否则您将无法区分 1.300 和 1.003。
    • @AbdelrahmanTarief:这个函数没有返回任何东西......这只是一个例子。我将对其进行编辑以允许您设置变量。
    • 非常感谢您的帮助 :)
    • 我希望你没有被我的愚蠢所困扰,但这正是我写的:int a,b,n;双 x=30.2334567;提取(x,&a,&b,&n);序列号.println(a); Serial.print(b/n);
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-01
    • 1970-01-01
    • 2012-09-29
    • 2020-05-18
    相关资源
    最近更新 更多