我被要求完成一项任务,以准确地打印出输入中的浮点数。所以基本上如果输入是 1.1 2.2 3.3 4.4,那么我的输出必须恰好是 1.1 2.2345678 3.3 4.4
这是我的代码:
void count_digits(double num) {
int decimal_whole_part;
double decimal;
//char character;
int final_value;
decimal = num - (int)num;
printf(" %d", (int)(num));
printf(".");
do{
decimal_whole_part = (int)(decimal);
decimal -= decimal_whole_part;
decimal*=10;
final_value = (int)(decimal);
printf("%c", (char)((decimal+32+16)));
} while((double)(final_value) != (double)(decimal));
}
我尝试使用浮点数,但它会导致尾随零,例如 1.100000 2.2345678000000...... 等等(请忽略不一致的零,它们在输出中是一致的)。我不能使用 %g、sprintf 或截断浮动。特别是,我无法使用格式说明符,因为输入浮点数的长度不一致。
我尝试将小数点之前和小数点之后的部分分开,将小数点之后的部分转换为ascii代码,并向其添加特定值以获取字符串形式的数字(抱歉英语不好)。我再次这样做是因为这项具有挑战性的任务涉及不使用 sprintf 和 %g。
我的输入:
1.11111 2.023 3.043
我的输出:
1.111110000000000042064129956997931003570556640625 2.023000000000000131450406115618534386157989501953125 3.0430000000000001492139745096210390329360961914062
所需输出:
1.11111 2.023 3.043
有人可以告诉我如何正确结束循环并获得所需的输出吗?谢谢。
数字是一个抽象的数学实体,例如十。每个数字有多种表示方式。例如,十可以表示为“十”、“10”、“10.00”和“1•101”。
A
float
、double
、int
或其他 C 算术类型仅表示数学值。它不存储有关数字如何表示的信息。1
因此,不可能从 C 算术类型可靠地重建数字的原始表示。特别是,您无法区分“1.1”和“1.100000”。
要记住输入形式,您应该将输入记录为字符串。为输入中的每个数字创建一个字符数组,并将输入项的字符存储在数组中。用空字符标记结尾(或记住长度)。
…行为异常的 do while 循环…
这与
do
循环无关,其行为并不异常。
1 算术类型可以存储一些有关如何表示数字的有限信息。 IEEE-754 十进制浮点格式对许多数字有多种表示形式,不同之处在于所使用的指数。没有用于此目的的标准 C 接口,它不会满足您的目的。