将浮点数转换为字符串

新手上路,请多包涵

在没有库函数 sprintf 的情况下,如何在 C/C++ 中将浮点整数转换为字符串?

我正在寻找一个函数,例如 char *ftoa(float num)num 转换为字符串并返回它。

ftoa(3.1415) 应该返回 "3.1415"

原文由 SIVA 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.3k
2 个回答

当您处理 fp 数字时,它可能会变得非常复杂,但算法很简单,类似于 edgar holleis 的答案;赞!它很复杂,因为当您处理浮点数时,根据您选择的精度,计算会有些偏差。这就是为什么将浮点数与零进行比较不是好的编程习惯。

但是有一个答案,这是我实施它的尝试。在这里,我使用了一个容差值,因此您最终不会计算太多小数位,从而导致无限循环。我敢肯定那里可能有更好的解决方案,但这应该有助于您很好地理解如何做到这一点。

 char fstr[80];
float num = 2.55f;
int m = log10(num);
int digit;
float tolerance = .0001f;

while (num > 0 + precision)
{
    float weight = pow(10.0f, m);
    digit = floor(num / weight);
    num -= (digit*weight);
    *(fstr++)= '0' + digit;
    if (m == 0)
        *(fstr++) = '.';
    m--;
}
*(fstr) = '\0';

原文由 Sophy Pal 发布,翻译遵循 CC BY-SA 2.5 许可协议

我的实现

//convert a floating point number to a C++ literal string
void ftoa(float value, char *str, int numberOfDecimals) {
  //find integer and fractional part
  float f_auxint, f_auxfract;
  f_auxfract = modff(value, &f_auxint);
  long intpart = long(f_auxint);
  long fractpart = long(floor((fabs(f_auxfract)*pow(10.0, float(numberOfDecimals)))+0.5));
  //covert integer part and copy it to literal string
  ltoa(intpart, &str[0], 10);
  //add dot (decimal separator)
  int lnhg = strlen(str);
  str[lnhg] = '.';
  lnhg += 1;
  //fill by '0' the rest of the destination string
  int aa = lnhg;
  for (size_t i = 0; i < numberOfDecimals; i++) {
    str[aa] = '0';
    aa += 1;
  }
  str[aa] = '\0';
  //covert fractional part in literal string
  char tempstr[10];
  ltoa(fractpart, &tempstr[0], 10);
  //shift cursor position based on how many zero there were
  int bb = strlen(tempstr);
  while (bb < numberOfDecimals) {
    lnhg += 1;
    bb+=1;
  }
  //paste fractional part to rest of the destination string
  for (size_t i = 0; i < strlen(tempstr); i++) {
    str[lnhg] = tempstr[i];
    lnhg+=1;
  }
}

原文由 Lorenzo Brun 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题