C编程浮点数?

C编程浮点数?,c,floating-point,C,Floating Point,所以,我正在读一个C程序。书和我读了这个练习: 编写一个程序,要求用户输入美元和美分的金额,然后显示添加了5%的金额? 解决方案: #include <stdio.h> int main(void) { float original_amount; printf("Enter an amount: "); scanf("%f", &original_amount); printf("With tax added: $%.2f\n", or

所以,我正在读一个C程序。书和我读了这个练习:

编写一个程序,要求用户输入美元和美分的金额,然后显示添加了5%的金额?

解决方案:

#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;
}
#包括
内部主(空){
浮动原始金额;
printf(“输入金额:”);
scanf(“%f”和原始金额);
printf(“含税:$%.2f\n”,原始金额*1.05f);
返回0;
}

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

1.05f
是一个值为1.05的浮点型
1.05f
是一个值为1.05的浮点型
1.05f
表示一个值约为1.05的浮点型(这是105%=100%+5%)。
%.2f
是一个格式说明符,与之非常不同

与该数字相乘实际上会使值增加5%(值*1.05=值*(100%+5%)=值+值*5%)


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

1.05f表示值约为1.05(即105%=100%+5%)的浮点数.The
%.2f
是一种格式说明符,与此截然不同

与该数字相乘实际上会使值增加5%(值*1.05=值*(100%+5%)=值+值*5%)


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

它是练习的
5%
部分。它等于:original\u amout+(original\u amout*5.0/100.0).

这是你练习的
5%
部分。它等于:原始数量+(原始数量*5.0/100.0)它的意思是1.05作为浮点数,你可以去掉f,它应该可以工作。它的意思是1.05作为浮点数,你可以去掉f,它应该可以工作。这个程序显然使用了乘以1.05f作为一个数字加5%的方法。但是,因为1.05f不完全是1.05,它是一个单精度的浮点数接近†至1.05

最接近1.05的
float
值为
1.049999523162841796875
(假设为通常的32位浮点格式)。由于要对结果进行四舍五入,您必须使用一些相当大的数字来查看错误的影响;当程序要求金额时,请尝试输入100000000:

Enter an amount: 100000000
With tax added: $104999992.00
如果使用双精度而不是单精度,也就是说,
double
而不是
float
1.05
而不是
1.05f
,表示误差会更小,但仍然不会精确到1.05,因为这个数字不能精确地表示为我们使用的二进制浮点数计算机使用。 对于100000000,你会得到一个正确的结果,但对于天文数字来说,结果仍然是“不正确的”


†)有多近?根据标准:

用于十进制浮点常量,也用于 十六进制浮点常量
FLT\u基数
不是2的幂,结果是 最近的可表示值,或较大或较小的可表示值 与最近的可表示值相邻,以实现定义的方式选择


该程序显然使用了乘
1.05f
的方法来给一个数字加上5%。但是,因为1.05f并不完全是1.05;这是一个接近†1.05的单精度浮点数

最接近1.05的
float
值为
1.049999523162841796875
(假设为通常的32位浮点格式)。因为你要对结果进行四舍五入,你必须使用一些相当大的数字来观察错误的影响;当程序要求金额时,尝试输入100000000:

Enter an amount: 100000000
With tax added: $104999992.00
如果使用双精度而不是单精度,也就是说,
double
而不是
float
1.05
而不是
1.05f
,表示误差会更小,但仍然不完全是1.05,因为这个数字不能精确地表示为我们计算机使用的二进制浮点数。 对于100000000,你会得到一个正确的结果,但对于天文数字来说,结果仍然是“不正确的”


†)有多近?根据标准:

用于十进制浮点常量,也用于 十六进制浮点常量
FLT\u基数
不是2的幂,结果是 最近的可表示值,或较大或较小的可表示值 与最近的可表示值相邻,以实现定义的方式选择

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

将格式说明符
%.2f
作为第一个参数传递给
printf
,而将
1.05f
作为参数列表的一部分传递,这两者之间存在混淆。正如您所指出的,第一个用于格式化。参数列表
1.05f
用于计算目的。向编译器指示要使用
float
,否则默认情况下它将被视为
double
数据类型,
原始金额*1.05f
的结果将存储在
double

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

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

你被搞糊涂了