余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 echarts动画效果失效的问题。官网下载的例子。
  • ¥60 许可证msc licensing软件报错显示已有相同版本软件,但是下一步显示无法读取日志目录。
  • ¥15 Attention is all you need 的代码运行
  • ¥15 一个服务器已经有一个系统了如果用usb再装一个系统,原来的系统会被覆盖掉吗
  • ¥15 使用esm_msa1_t12_100M_UR50S蛋白质语言模型进行零样本预测时,终端显示出了sequence handled的进度条,但是并不出结果就自动终止回到命令提示行了是怎么回事:
  • ¥15 前置放大电路与功率放大电路相连放大倍数出现问题
  • ¥30 关于<main>标签页面跳转的问题
  • ¥80 部署运行web自动化项目
  • ¥15 腾讯云如何建立同一个项目中物模型之间的联系
  • ¥30 VMware 云桌面水印如何添加