C 如何在没有sprintf的情况下将浮点转换为字符串?
我的代码采用字符串格式并将其组合到缓冲区中(没有C 如何在没有sprintf的情况下将浮点转换为字符串?,c,string,floating-point,type-conversion,C,String,Floating Point,Type Conversion,我的代码采用字符串格式并将其组合到缓冲区中(没有sprintf,itoa等) 我在将浮点数字转换为字符串时遇到问题,因为我需要具有最多7位的精度,并且没有尾随零。以及将float变量中的每个数字转换为char(但在这方面我不需要任何帮助) 我尝试了几种方法,都包括数学计算,但都没有达到预期的效果。 这是我到目前为止的代码,但它很混乱,有时给出的结果也不正确。我还相信有一种更干净、更不复杂的方法可以做到这一点。 任何帮助都将受到广泛的感谢 if (*format == 'f
sprintf
,itoa
等)
我在将浮点
数字转换为字符串
时遇到问题,因为我需要具有最多7位的精度,并且没有尾随零。以及将float
变量中的每个数字转换为char
(但在这方面我不需要任何帮助)
我尝试了几种方法,都包括数学计算,但都没有达到预期的效果。
这是我到目前为止的代码,但它很混乱,有时给出的结果也不正确。我还相信有一种更干净、更不复杂的方法可以做到这一点。
任何帮助都将受到广泛的感谢
if (*format == 'f') {
float f = *(float*)ptrs[counter];
char str[30];
int b, c, m, k = 7, i = 0, l = 0;
int a = f;
f -= a;
while (k >= 0) {
l = pow(10, k);
m = a / l;
if (m > 0) {
break;
}
k--;
}
printf("%d", k);
for (l = k + 1; l > 0; l--) {
b = pow(10, l - 1);
c = a / b;
str[i++] = c + 48;
a %= b;
}
str[i++] = '.';
for (l = 0; l < 7; l++) {
f *= 10.0;
b = f;
str[i++] = b + 48;
f -= b;
}
for (i = 0; i < 7; i++) {
*buffer = str[i];
buffer++;
}
counter++;
str[i] = '\0';
if(*格式=='f'){
浮点数f=*(浮点数*)PTR[计数器];
char-str[30];
int b,c,m,k=7,i=0,l=0;
int a=f;
f-=a;
而(k>=0){
l=功率(10,k);
m=a/l;
如果(m>0){
打破
}
k--;
}
printf(“%d”,k);
对于(l=k+1;l>0;l--){
b=功率(10,l-1);
c=a/b;
str[i++]=c+48;
a%=b;
}
str[i++]=';
对于(l=0;l<7;l++){
f*=10.0;
b=f;
str[i++]=b+48;
f-=b;
}
对于(i=0;i<7;i++){
*缓冲区=str[i];
缓冲区++;
}
计数器++;
str[i]='\0';
例如:
输入:float v2=0.9372;
输出:
.937199
所需输出:
0.9372
输入:
float v2=0.25000;
输出:
1.25000
所需输出:
0.25
他很邋遢,有时也会给出错误的结果 考虑到典型浮点的base 2特性,程序员需要做出以下选择:
- 接近正确答案的简短代码
- 使用相当数量的代码进行精确正确的转换
- 介于两者之间的东西
- 无穷大
- 不是一个数字
- 像-0.0这样的怪事
不准确的来源 OP对
int
的使用将float
限制在[int\u MIN…int\u MAX]左右。在float
的范围之外,代码会失败。可以使用long-long
获得更多的范围,而无需大量代码更改。更好的研究float-modff(float-value,float*iptr)
重复使用下面的f*=10.0
和f
中的分数值,在每次迭代时注入可能的舍入(不精确)
for(l=0;l<7;l++) {
f*=10.0;
显示a,包括调用此代码的代码、使用的输入、获得的输出和所需的输出。通常不能使用十的幂将二进制浮点格式的数字转换为十进制,因为在二进制格式中乘以或除以十的幂会增加舍入错误,使转换的数字失真。对于完整解决方案,您需要使用某种形式的扩展精度或高级技术。如果您只需要转换有限域中的数字,该域可能会有更简单的部分解决方案。您需要指定域,例如小于10^6的数字,最多转换为六个有效数字。@EricPostChil如果我理解y的话没错,我只需要最多7位的精度。@pmg不使用sprintf.comment在编辑后删除restore Monice“稍后打印7位”的确切含义是什么?此处的代码将
f
分为整数部分和小数部分。可能您希望先打印整数部分,然后再打印小数部分。
for(l=0;l<7;l++) {
f*=10.0;
// ASSUME f >= 0.0, (sign handling done before here)
long long a=f;
f-=a;
int int_f = round(f*pow(10, 7));
if (int_f < 10000000) {
later_printf_the_7_digits(int_f);
} else {
a++;
later_printf_the_7_digits(0);
}