搜索
查看: 907|回复: 4
打印 上一主题 下一主题

啊哈C语言第二章第五节,为什么5.2+3.1出现的得数是8.299999?

[复制链接]
跳转到指定楼层
楼主
发表于 2017-4-29 12:56:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
5啊哈币
本帖最后由 小明_V3IID 于 2017-4-29 13:05 编辑

#include <stdio.h>
#include <stdlib.h>
int main()
{
        float a,b,c;
    a=5.2;
    b=3.1;
    c=a+b;
    printf("%f",c);
        system("pause");
        return 0;
}
为什么得出的不是8.3,而是8.299999呢?


同样的,第一个练习题1.2+2.3+3.4+4.5,得出的数字是11.4000000。
#include <stdio.h>
#include <stdlib.h>
int main()
{
        float a,b,c,d,e;
    a=1.2;
    b=2.3;
    c=3.4;
    d=4.5;
    e=a+b+c+d;
    printf("%f",e);
        system("pause");
        return 0;
}

这是为什么呢,怎么改成正常的呢?

最佳答案

查看完整内容

浮点数在运算的时候会有精度丢失的问题。 比如说: 5.2用二进制表示的话是:101.0011(无限循环)。 但是float只有32位,因此部分数据被丢弃。同样的,3.1也会有部分数据丢失。 运算过程中就会有误差。输出的时候自然也是有误差。 可以这样修改: #include int main(){ float a,b,c; a = 5.2; b = 3.1; c = a + b; //只保留两位有效数字,同时会进行四舍五入操作,8.299999就会变成8.30 ...
沙发
发表于 2017-4-29 12:56:31 | 只看该作者
浮点数在运算的时候会有精度丢失的问题。
比如说:
5.2用二进制表示的话是:101.0011(无限循环)。
但是float只有32位,因此部分数据被丢弃。同样的,3.1也会有部分数据丢失。
运算过程中就会有误差。输出的时候自然也是有误差。
可以这样修改:

#include <stdio.h>

int main(){
     float a,b,c;
    a = 5.2;
    b = 3.1;
    c = a + b;
    //只保留两位有效数字,同时会进行四舍五入操作,8.299999就会变成8.30
    printf("%.2f\n",c);

    a = 5.2 * 100;
    b = 3.1 * 100;
    c = (a + b) / 100;
    //将数值变成原来的100倍,误差将会被缩小到可以忽视。
    printf("%f",c);
    return 0;
}
板凳
发表于 2017-5-6 19:32:21 | 只看该作者
限制小数点后的位数,但不同的编译器有不同的进位方式。
地板
发表于 2017-5-14 18:40:11 | 只看该作者
你把%f改成%.1lf,应该就好了吧
5#
 楼主| 发表于 2017-5-29 21:49:28 | 只看该作者
谢谢您!原理和操作都讲解得非常详细和清楚
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

广播台
特别关注
快速回复 返回顶部 返回列表