zwy94559 发表于 2023-11-4 21:08:30

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

#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 。。。

Mike_python小 发表于 2023-11-4 21:08:52

浮点数的加法输出结果出现微小的误差,是因为计算机在表示浮点数时采用的是有限位数的二进制表示,无法精确地表示所有的实数。这种误差称为浮点数舍入误差。

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

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

例如,你可以使用 "%.6f" 来限制输出小数点后六位的精度:


printf("%.6f\n", price_2);


这样就能够得到更接近预期值的结果。

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

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

球一个最佳答案谢谢啦!这对我非常重要!{:10_254:}{:10_254:}{:10_254:}

isdkz 发表于 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,避免了显示不准确的结果。
页: [1]
查看完整版本: 为什么浮点数的加法输出的结果会出错???