c - 打印浮点变量

标签 c

<分区>

下面是我的代码和程序输出:

#include <stdio.h>
int main()
{
float salary;
printf("Please enter the salary : ");
scanf("%f", &salary);
printf("Your Salary is : %f\n", salary);
}


desktop:~$ ./a.out 
Please enter the salary : 101.8889999
Your Salary is : 101.889000
desktop:~$ 

我通过输入随机十进制值尝试了很多方法,但有时它会打印出正确的值(在 scanf 调用期间输入),有时它只会打印出接近它的值。为什么 float 变量值没有打印输入的正确值?

按照上面的例子 - 如果我输入 101.8889999 那么保存在 salary float 变量中的值是 101.889000?

我尝试将最后一行更改为:

printf("Your Salary is : %10.9f\n", salary);

但它仍然给出以下输出:

Please enter the salary : 101.889000
Your Salary is : 101.888999939

Please enter the salary : 10.999999999
Your Salary is : 11.000000000

哪个是使用 printf 打印 float 的正确值?float 值是否可以/不能存储为 float 变量中输入的精确值?

最佳答案

在 C 和许多其他语言中, float 以固定位数(通常为 32 或 64)存储,因此它们的精度是有限的,并且只有有限数量的数字可以用 float 精确表示。对于所有其他数字, float 只能存储一个近似值。您可以通过打印 8 * sizeof(float) 的值来查看使用了多少位。

此外,浮点运算通常存在舍入误差,这使得它们不适合处理货币。

如果您要处理金钱,您可能会考虑将这些值存储为表示便士数、百分之一便士或类似值的整数。

关于c - 打印浮点变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25166245/

相关文章:

c - 如何修剪该数组中的空格(右侧)?

c - 使用atoi检查字符串

c - 将 wordexp 的输出提供给 getopt_long 会使我的 linux cli 应用程序崩溃

C - 初始化结构数组

c++ - 使用gcc编译c/c++程序

C:通过 TCP 套接字发送嵌套结构

python - 将图像数组从 Python 传递到 C 会带来损坏的数据

c - 在 scanf() 中单独输入?

c - 有没有办法从 linux 命令行中找到关于 C 关键字的信息?

c - strtol() 和 atol() 不转换大于 9 位的字符串