1

所以,我正在阅读C prog。书,我读了这个练习:

Write a program which asks the user to enter a dollars-and-cents amount, then displays the amount with 5% added?

解决方案 :

#include <stdio.h>

int main(void) {

    float original_amount;

    printf("Enter an amount: ");
    scanf("%f", &original_amount);
    printf("With tax added: $%.2f\n", original_amount * 1.05f);

    return 0;
}

我知道是什么.3f意思(后面应该有 3 个数字……),但这是什么1.05f意思?

4

6 回答 6

7

1.05f确实表示一个浮点数,其值约为 1.05(即 105% = 100% + 5%)。这%.2f是一个格式说明符,是非常不同的东西。

与这个数字相乘实际上会在值上增加 5%(值 * 1.05 = 值 * (100% + 5%) = 值 + 值 * 5%)。

格式说明符出现在printf-like 函数的第一个参数中,并告诉函数如何输出与其位置对应的参数。

于 2013-07-19T10:04:07.320 回答
2

1.05f是一个浮点类型,值为 1.05

于 2013-07-19T10:03:58.700 回答
1

该程序显然使用乘法1.05f来将 5% 加到一个数字上。但是,由于表示错误, 1.05f 不完全是 1.05;这是一个接近†</sup>到 1.05的单精度浮点数。

float最接近 1.05的值是1.0499999523162841796875(假设通常是 32 位浮点格式)。由于您将结果四舍五入,您将不得不使用一些相当大的数字来查看错误的影响;当程序询问金额时,尝试输入 100000000:

Enter an amount: 100000000
With tax added: $104999992.00

如果你使用双精度而不是单精度,也就是说,doublefloatand1.05而不是1.05f,表示误差会更小,但它仍然不会完全是 1.05,因为这个数字不能完全表示为我们计算机的二进制浮点数利用。你会得到 100000000 的正确结果,但对于天文数字来说仍然是“不正确”的结果。


†) 多近?从标准:

对于十进制浮点常量,以及当 FLT_RADIX 不是 2 的幂时的十六进制浮点常量,结果要么是最接近的可表示值,要么是紧邻最接近的可表示值的较大或较小的可表示值,以实现定义的方式选择.

于 2013-07-19T10:49:59.200 回答
0

5%是你锻炼的一部分。它等于: original_amout + (original_amout * 5.0 / 100.0)。

于 2013-07-19T10:04:47.357 回答
0

这意味着 1.05 作为 float float 你可以把 f 拿走它应该可以工作

于 2013-07-19T10:04:56.320 回答
0

printf原型为int printf(const char *restrict format, ...);,它使用const char *restrict format字符串来格式化打印的数据。

您对%.2f作为第一个参数传递的格式说明符printf1.05f作为参数列表的一部分传递的格式说明符感到困惑。正如您所指出的,第一个用于格式化。参数列表1.05f用于计算目的f。它向编译器指示您要使用 a float,否则默认情况下它将被视为double数据类型,并且结果original_amount * 1.05f将存储在 a 中double

float当您知道数字适合该范围时,使用 a 就足够了float。为了表明这一点,您将 a 附加f到参数列表中的数字

于 2013-07-19T11:18:35.620 回答