【发布时间】:2016-02-21 22:08:06
【问题描述】:
我正在尝试编写我的 printf() 函数。我想打印浮点/双精度值。到目前为止,这是我设法做到的。
static void ft_float(va_list *ap, t_flag *flags)
{
double myfloat;
signed long int decipart;
signed long int intpart;
myfloat = va_arg(*ap, double);
if (myfloat < 0)
{
ft_myputchar('-');
myfloat *= -1;
}
intpart = (signed long int)myfloat;
ft_putnbr(intpart);
ft_myputchar('.');
myfloat -= intpart;
myfloat *= 1000000; //upto 6 decimal points
decipart = (signed long int)(myfloat + 0.5); //+0.5 to round of the value
ft_putnbr(decipart);
}
正如您所看到的,出于显而易见的原因,该代码适用于 1.424352、12313.1341414 等浮点数。但当小数点后的值小于 1 时,例如 1.004243、12313.0001341 等,则不行。
【问题讨论】:
-
你有什么问题?
-
将浮点数正确转换为字符串is hard。另外,什么是“不起作用”?请告诉我们会发生什么。 “它不起作用”不是错误描述。
-
没有更简单的方法来转换它们吗?
-
这并不容易,除非您非常小心,否则您经常会得到错误的结果。有关正确执行此操作的算法,请参阅我链接的论文。您对“产生几乎正确的结果”中几乎正确的解决方案是否满意?
-
那是因为您忽略了在宽度为 6 的字段中打印带有前导零的小数部分。
标签: c floating-point printf