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

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 latex投稿显示click download
  • ¥15 请问读取环境变量文件失败是什么原因?
  • ¥15 在若依框架下实现人脸识别
  • ¥15 网络科学导论,网络控制
  • ¥100 安卓tv程序连接SQLSERVER2008问题
  • ¥15 利用Sentinel-2和Landsat8做一个水库的长时序NDVI的对比,为什么Snetinel-2计算的结果最小值特别小,而Lansat8就很平均
  • ¥15 metadata提取的PDF元数据,如何转换为一个Excel
  • ¥15 关于arduino编程toCharArray()函数的使用
  • ¥100 vc++混合CEF采用CLR方式编译报错
  • ¥15 coze 的插件输入飞书多维表格 app_token 后一直显示错误,如何解决?