c语言浮点数相加存在问题

小明过年挣了些压岁钱,他打算把这些钱存到银行。银行存款年利率如下,存的时间越长,每年的利率越高。小明可以按不同的年限存款,请帮小明计算到期后的利息和本金。
1年期3%;
2年期3.3%;
3年期3.8%;
4年期4.0%;
5年及以上4.2%。

输入描述

输入两个数,第一个是存款本金,第二个存款年数。

输出描述

输出到期后的利息和总金额,保留两位小数,具体格式见示例输出。

用例输入 1

100.5 1
用例输出 1

interest=3.02, total=103.52
代码如下

#include
int main(){
    float b;int n,i;
    float interest,total;
    scanf("%f %d",&b,&n);
    if(n==1) interest=b*0.03;
    else if(n==2) interest=b*2*0.033;
    else if(n==3) interest=b*3*0.038;
    else if(n==4) interest=b*4*0.04;
    else if(n>=5) interest=b*n*0.042;
    total=b+interest;
    printf("interest=%.2f,total=%.2f\n",interest,total);
}

输出结果我不知道为什么我是interest=3.02, total=103.51,
我如果不保留小数结果是interest=3.015000,total=103.514999,
为什么total=b+interest;这种float型相加是这种结果,请帮我解答一下,谢谢

浮点数通常是用二进制浮点数来表示的,而二进制浮点数不能精确表示所有的十进制数。所以,当进行浮点数运算时,有时会出现精度误差。

在代码中,每个利率都是一个小数,比如0.03、0.033等。这些小数都是二进制浮点数,并不能精确表示。所以在计算利息时,会有一定的精度误差。这就是为什么计算出来的利息和总金额有小数点后两位的误差的原因。

如果想精确计算,可以使用整数进行运算,然后在最后再除以100来得到精确的结果。这样就可以避免浮点数精度误差的问题。

可以把利率表示成整数,如下所示:

1年期3%:300
2年期3.3%:330
3年期3.8%:380
4年期4.0%:400
5年及以上4.2%:420

然后可以把利率和本金全部乘以100,这样就可以使用整数进行运算了。对于1年期的利息,可以这样计算:

interest = b * n * 300 / 100;

最后可以使用printf函数的"%.2f"格式指示符来输出保留两位小数的结果。例如可以这样输出利息和总金额:

printf("interest=%.2f, total=%.2f\n", interest / 100.0, (b + interest) / 100.0);

这样就可以输出精确的利息和总金额了。
望采纳。

在计算机中,浮点数有一个精度的限制,就是它最多只能精确表示一些小数。对于浮点数的加减乘除运算,也会由于精度的限制而导致结果的误差。

例如,当你在计算 0.1+0.2 的结果时,计算机会将 0.1 和 0.2 转换成二进制后进行计算,但是因为二进制中无法精确表示 0.1 和 0.2,所以计算机计算出来的结果也不会是完全精确的。

在你的代码中,interest 和 total 的值都是由浮点数计算得到的,所以在 输出时可能会出现类似的精度误差。

为了解决这个问题,你可以使用一些方法来控制输出的精度,例如在 printf 函数中使用 %.2f 来控制输出精度,这样输出的数字会保留两位小数。