在没有库函数 sprintf
的情况下,如何在 C/C++ 中将浮点整数转换为字符串?
我正在寻找一个函数,例如 char *ftoa(float num)
将 num
转换为字符串并返回它。
ftoa(3.1415)
应该返回 "3.1415"
。
原文由 SIVA 发布,翻译遵循 CC BY-SA 4.0 许可协议
在没有库函数 sprintf
的情况下,如何在 C/C++ 中将浮点整数转换为字符串?
我正在寻找一个函数,例如 char *ftoa(float num)
将 num
转换为字符串并返回它。
ftoa(3.1415)
应该返回 "3.1415"
。
原文由 SIVA 发布,翻译遵循 CC BY-SA 4.0 许可协议
我的实现
//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 许可协议
3 回答2k 阅读✓ 已解决
2 回答3.9k 阅读✓ 已解决
2 回答3.2k 阅读✓ 已解决
1 回答3.2k 阅读✓ 已解决
1 回答2.7k 阅读✓ 已解决
3 回答3.4k 阅读
1 回答1.6k 阅读✓ 已解决
当您处理 fp 数字时,它可能会变得非常复杂,但算法很简单,类似于 edgar holleis 的答案;赞!它很复杂,因为当您处理浮点数时,根据您选择的精度,计算会有些偏差。这就是为什么将浮点数与零进行比较不是好的编程习惯。
但是有一个答案,这是我实施它的尝试。在这里,我使用了一个容差值,因此您最终不会计算太多小数位,从而导致无限循环。我敢肯定那里可能有更好的解决方案,但这应该有助于您很好地理解如何做到这一点。