【问题标题】:C string to float conversion [duplicate]C字符串到浮点转换[重复]
【发布时间】:2016-03-15 17:24:49
【问题描述】:

我需要在没有 atof() 或任何其他字符串操作函数的情况下将诸如“3.456”之类的字符串转换为浮点数。下面是我的代码,适用于 c 字符串到 int 的转换,但由于句点的原因,显然不适用于浮点数。我需要添加什么来处理这个时期?谢谢。

#include <stdio.h>

int size;
char string[] = "345";
int result = 0;
int i = 0;

int findLength(char string[]){

for(size = 0; string[size]!='\0'; size++){

 }
return size;
};

void conversion(char string[]){

result = result * 10 + ( string[i] - '0' );
if (i < size - 1) {
i++;
conversion(string);
 }
}

int main(int argc, const char * argv[]) {
findLength(string);
conversion(string);
printf("%d\n", result);
return 0;
}

【问题讨论】:

  • 正确地做到这一点需要几千行代码,不分上下。
  • 互联网上有很多例子,例如atof.c
  • 我会使用逐字符状态机。也许只是我.. :)
  • 你试过使用 sscanf 吗?
  • @bruceg 谢谢你提供的链接

标签: c string floating-point


【解决方案1】:

首先,我认为了解浮点数的工作原理以及它们的表示方式对您来说很重要,至少在 C 语言中是这样。请查看question/reply 了解更多信息。

现在回到你的问题。由于浮点数在内存中的表示方式,您可能无法获得精确的转换。也就是说,您可能无法将“3.456”精确转换为包含值 3.456 的浮点数。您将只能接近您想要的确切值。

首先你的代码有几个问题:

  • 除非必要,否则我不会在代码中使用全局变量。您将“大小”定义为全局变量,这不是一个好习惯。
  • 使用标准库 strlen 函数来获取字符串的长度,而不是重写一个这样做的函数。

您将在下面找到一个可行的解决方案。转换方法如下:

  • 扫描字符串得到小数点的位置
  • 如果遇到非点字符,将其添加到结果中
  • 当您完成对字符串的扫描后,您需要考虑小数点前数字的幂。例如,将小数点前的第一位数字简单地添加到结果中。小数点前的第二个数字乘以 10.0 并添加到结果中,依此类推。如代码所示,这是通过一个简单的 while 循环来完成的。
#include <stdio.h>
#include <string.h>
float stringToFloat(char *string)
{
    float result= 0.0;
    int len = strlen(string);
    int dotPosition = 0;

    for (int i = 0; i < len; i++)
    {
        if (string[i] == '.')
        {
          dotPosition = len - i  - 1;
        }
        else
        {
          result = result * 10.0 + (string[i]-'0');
        }
      }

      while (dotPosition--)
      {
        result /= 10.0;
      }

    return result;
}

int  main()
{
  char string[] = "3.456";

  printf("%f\n",stringToFloat(string));
}

我希望这会有所帮助。

P.S: 你可以通过使用双精度而不是浮点数来提高精度。

【讨论】:

  • 您的回复非常有帮助,谢谢!
  • 这行得通,因为您不关心获得所谓的“正确舍入”结果。例如,对于“1234.56”,正确答案是 1234.56005859375(如果您打印其所有数字),即十六进制的 0x1.34a3d8p10。您的代码以十六进制返回 1234.5599365234375 或 0x1.34a3d6p+10;即比正确值低一个“最后一个单位”。 (另外,你可能想在你的文字后面加上 'f' 后缀,这样你的中间值是浮点数而不是双精度值。)
猜你喜欢
  • 2014-01-16
  • 1970-01-01
  • 2019-11-21
  • 2013-10-06
  • 1970-01-01
  • 1970-01-01
  • 2013-10-03
  • 2017-05-09
  • 2016-01-30
相关资源
最近更新 更多