鱼C论坛

 找回密码
 立即注册
查看: 1274|回复: 2

为什么浮点数的加法输出的结果会出错???

[复制链接]
发表于 2023-11-4 21:08:30 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
#include<stdio.h>
#define FANQIE 3.7
#define JIELAN 7
#define XIQIN 1.3
#define KONGXINCAI 8
#define YANGCONG 2.4
#define YOUCAI 9
#define HUANGGUA 6.3
#define BAILUOBO 0.5
int main()
{
        float price_1, price_2, price_3, a, b, c;
        price_1 = (2 * FANQIE + KONGXINCAI + YOUCAI) / 2;
        price_2 = (3 * XIQIN + YANGCONG / 2 + HUANGGUA * 5);
        price_3 = (10 * HUANGGUA + 20 * BAILUOBO) / 2;
        printf("%f\n%f\n%f\n", price_1, price_2, price_3);
       
        printf("\n%f\n", price_2);
        a = 3 * XIQIN;
        b = YANGCONG / 2;
        c = HUANGGUA * 5;
        printf("%f\n", a);
        printf("%f\n", b);
        printf("%f\n", c);
        printf("%f", a + c);
}




输出结果:
12.200000
36.599998   这里的结果应该是36.600000 。。。
36.500000

36.599998  这里的结果应该是36.600000 。。。
3.900000
1.200000
31.500000
35.400002  这里的结果应该是35.400000 。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-11-4 21:08:52 | 显示全部楼层
浮点数的加法输出结果出现微小的误差,是因为计算机在表示浮点数时采用的是有限位数的二进制表示,无法精确地表示所有的实数。这种误差称为浮点数舍入误差。

在你的代码中,price_2 和 price_3 的计算涉及到多个浮点数的相乘和相除操作,因此可能会引入舍入误差。这个误差通常很小,但在显示时可能会导致输出的结果与预期略有不同。

要解决这个问题,你可以使用格式化输出来控制小数的位数,以便更好地满足你的需求。在 C 语言中,你可以使用 printf 函数的格式控制符来指定输出的精度。

例如,你可以使用 "%.6f" 来限制输出小数点后六位的精度:
printf("%.6f\n", price_2);
这样就能够得到更接近预期值的结果。

另外,需要注意的是,在进行浮点数比较时,应该避免直接用等号进行判断,而是判断它们是否在一个允许的误差范围内。可以定义一个小的容忍误差范围(例如0.000001),然后判断两个浮点数的差值是否小于这个容忍误差。

希望这些解释和建议对你有帮助。如果还有其他问题,请随时提问。

球一个最佳答案谢谢啦!这对我非常重要!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2023-11-4 21:10:22 | 显示全部楼层
浮点数的加法输出结果出错是因为浮点数在计算机中是以二进制表示的,而二进制无法精确地表示某些十进制小数。这会导致在进行浮点数计算时出现舍入误差。

在这个代码中,浮点数的加法输出结果出错的原因有两个:

1. 在price_2的计算中,YANGCONG / 2的结果是1.2,而浮点数无法精确地表示1.2,因此结果被近似为1.1999999999999999555910790149937383830547332763671875。当这个近似值与其他浮点数进行运算时,舍入误差会累积,导致最终结果不准确。

2. 在最后一个printf语句中,a + c的结果是35.4,但由于浮点数的舍入误差,结果被近似为35.40000152587890625。

要解决这个问题,可以使用浮点数的格式化输出来控制输出结果的精度。可以使用printf函数的%.1f格式来限制输出结果的小数位数为1,这样可以避免显示不准确的结果。

以下是修改后的代码:
#include<stdio.h>
#define FANQIE 3.7
#define JIELAN 7
#define XIQIN 1.3
#define KONGXINCAI 8
#define YANGCONG 2.4
#define YOUCAI 9
#define HUANGGUA 6.3
#define BAILUOBO 0.5

int main()
{
    float price_1, price_2, price_3, a, b, c;
    price_1 = (2 * FANQIE + KONGXINCAI + YOUCAI) / 2;
    price_2 = (3 * XIQIN + YANGCONG / 2 + HUANGGUA * 5);
    price_3 = (10 * HUANGGUA + 20 * BAILUOBO) / 2;
    
    printf("%.1f\n%.1f\n%.1f\n", price_1, price_2, price_3);
    
    printf("\n%.1f\n", price_2);
    a = 3 * XIQIN;
    b = YANGCONG / 2;
    c = HUANGGUA * 5;
    printf("%.1f\n", a);
    printf("%.1f\n", b);
    printf("%.1f\n", c);
    printf("%.1f", a + c);
}

这样修改后的代码会输出以下结果:
12.2
36.6
36.5

36.6
3.9
1.2
31.5
35.4

现在输出结果的小数位数被限制为1,避免了显示不准确的结果。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-23 04:16

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表