余skr 2022-12-27 19:47 采纳率: 92.3%
浏览 78
已结题

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<stdio.h>
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型相加是这种结果,请帮我解答一下,谢谢

  • 写回答

2条回答 默认 最新

  • |__WhoAmI__| 2022-12-27 19:51
    关注

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

    在代码中,每个利率都是一个小数,比如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);
    

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

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 1月5日
  • 已采纳回答 12月28日
  • 创建了问题 12月27日

悬赏问题

  • ¥15 图像信息库的建立与识别
  • ¥15 韩国网站购物,KG支付的支付回调如何解决
  • ¥15 workstation导入ovf文件,报错,怎么解决呢?
  • ¥15 关于#c语言#的问题:构成555单稳态触发器,采用LED指示灯延时时间,对延时时间进行测量并显示(如楼道声控延时灯)需要Proteus仿真图和C语言代码
  • ¥15 workstation加载centos进入emergency模式,查看日志报警如图,怎样解决呢?
  • ¥50 如何用单纯形法寻优不能精准找不到给定的参数,并联机构误差识别,给定误差有7个?matlab
  • ¥15 workstation加载centos进入emergency模式,查看日志报警如图,没有XFS,怎样解决呢?
  • ¥15 应用商店如何检测在架应用内容是否违规?
  • ¥15 Ubuntu系统配置PX4
  • ¥50 nw.js调用activex