尝试在 C 中将浮点数转换为字符串时,如何解决异常行为的 do while 循环?

问题描述 投票:0回答:1

我被要求完成一项任务,以准确地打印出输入中的浮点数。所以基本上如果输入是 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.0430000000000 001492139745096210390329360961914062 所需输出:1.11111 2.023 3.043

(请忽略换行符,文本框中空间不足)。

有人可以告诉我如何正确结束循环并获得所需的输出吗?谢谢。

arrays c string
1个回答
0
投票

数字是一个抽象的数学实体,例如十。每个数字有多种表示方式。例如,十可以表示为“十”、“10”、“10.00”和“1•101”。

A

float
double
int
或其他 C 算术类型仅表示数学值。它不存储有关数字如何表示的信息。

因此,不可能从 C 算术类型可靠地重建数字的原始表示。特别是,您无法区分“1.1”和“1.100000”。

要记住输入形式,您应该将输入记录为字符串。为输入中的每个数字创建一个字符数组,并将输入项的字符存储在数组中。用空字符标记结尾(或记住长度)。

© www.soinside.com 2019 - 2024. All rights reserved.