我们说我有:
f = ((100+x)/x)*1.5.
其中f
的类型为float
。
如何将其转换为具有指定精度的字符串?
答案 0 :(得分:0)
始终尝试使用标准库功能。从float创建字符串,精确,你可以使用sprintf。
示例:
#include <stdio.h>
#include <math.h>
int main()
{
char str[80];
sprintf(str, "Value of Pi = %f", M_PI);
return(0);
}
答案 1 :(得分:0)
使用snprintf将float编码为字符串并将其放入您提供的字符缓冲区中。第二个参数是缓冲区的大小,以确保您不会溢出可用空间。您还需要检查snprintf的结果,以确保成功创建字符串而不会溢出。
#include <assert.h>
#include <stdio.h>
int main()
{
float number_as_float = 6.02;
char number_as_ascii[40];
assert(snprintf(number_as_ascii, 40, "%f", number_as_float) <= 40);
return(0);
}
答案 2 :(得分:0)
如何将其转换为具有指定精度的字符串?
有两种方法可以考虑double/float x
的精度:
在相对意义上
int precision = 7;
// print to the 1+7 most significant digits
printf("%.*e\n", precision, x);
绝对意义上的
int precision = 7;
// print to the closest 0.0000001
printf("%.*f\n", precision, x);
打印到字符串时,两者都存在字符串/空间管理问题。假设缓冲区不会溢出,使用sprintf()
代替printf()
就足够了。
int precision = 7;
// sign dig . precision e sign expo \0
char buf[1 + 1 + 1 + precision + 1 + 1 + 5 + 1];
// print to the 1+7 most significant digits
sprintf(buf, "%.*e", precision, x);
使用%f
非常棘手,因为数字可能是DBL_MAX
需要数百或数千个数字。
int precision = 7;
// sign ------digs-------- . precision \0
char buf[1 + DBL_MAX_10_EXP + 1 + 1 + precision + 1];
// print to the closest 0.0000001
sprintf(buf, "%.*f", precision, x);
一种经典的方法是使用snprintf()
计算所需的空间,通过0
空间调用一次,然后确定大小需求。 snprintf()
不会溢出给定大小的缓冲区。仍然需要检查snprintf()
结果以检测缓冲区尺寸过小的情况。
int need = snprintf(NULL, 0, some_format, x);
assert(need >= 0);
char *buf = malloc(need + 1u);
assert(buf);
int need2 = snprintf(buf, need + 1u, same_format_as_before, x);
assert(need2 == need);
...
// do something with buf
...
free(buf);
注意:考虑到极端数字和 locale 效果,很容易错误地缩小缓冲区的大小。
注意:此处的某些代码假定指数不会超过5位数或99999.强大的解决方案可根据需要调整大小。
答案 3 :(得分:-1)
使用sprintf
功能。
float f = 100/3;
char *s = malloc(128);
sprintf(s, "%f", f);