c - 在 C 中仅使用系统调用打印浮点值

标签 c floating-point double system-calls

我正在尝试编写一个 C 程序来以人类可读的格式(即 KB、MB、GB 等)打印文件大小。输入是以字节为单位的文件大小。要注意的是,这将仅使用系统调用而不是库调用来完成。

我已经编写了一个将正整数转换为字符串的函数,然后使用 write() 系统调用将其打印出来。我不知道如何使用 write() 打印十进制值,因为转换后的文件大小(以 KB 或 MB 或 GB 为单位)可能是小数。(例如:4.0K、5.6G 等)。

此外,是否可以将精度限制为某个固定长度(比如 2 位小数)??

最佳答案

在很多情况下,您可以像处理整数一样转换 float 。首先通过将 float 转换为 int 并将其转换为字符串来转换整数部分。然后附加小数点,从原始 float 中减去整数,乘以所需的精度并执行相同操作(如果需要,使用前导零)。

从概念上讲,您可以这样做:

int integerPart = myFloat;
int decimalPart = (myFloat - integerPart) * 1000; // for three decimal places
char* stringRep = intToStringNoLeadingZeros(integerPart);
appendChar(stringRep, '.');
appendIntToStringWithLeadingZeros(stringRep, decimalPart);

不适用于大于最大可能整数的 float ,如果您需要很多小数位,它会失去精度。但对于常见情况,这是一种快速的方法。如果您希望它适用于所有情况,您将不得不编写直接解释浮点格式的代码,但我认为这需要做更多的工作。

关于c - 在 C 中仅使用系统调用打印浮点值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25643428/

相关文章:

我可以使用 getchar() 清除 scanf 和 fgets 之间的缓冲区吗?

c++ - 如何创建彩条(电视测试图案)

c - 是什么导致数组中的 float 舍入?

c - 用户通过键盘给出的数字在数组中出现了多少次

CIVL 检测 OpenMP 程序中的数据竞争 - 正确吗?

c++ - 访问 float 的 4 个字节是否会破坏 C++ 别名规则

python - 字典记录在打印时被截断

c++ - 如何正确迭代 double

java - 如何比较Java中的 double 序列都是 "approximately equal"?

c# - 浮点精度格式以抑制尾随零