如何打印出与输入中的内容完全相同的浮点数?

问题描述 投票: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.0430000000000001492139745096210390329360961914062

所需输出:

1.11111 2.023 3.043

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

arrays c string
1个回答
0
投票

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

A

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

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

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

…行为异常的 do while 循环…

这与

do
循环无关,其行为并不异常。

脚注

1 算术类型可以存储一些有关如何表示数字的有限信息。 IEEE-754 十进制浮点格式对许多数字有多种表示形式,不同之处在于所使用的指数。没有用于此目的的标准 C 接口,它不会满足您的目的。

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