问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

C语言中四舍五入问题的详细解析

创作时间:
作者:
@小白创作中心

C语言中四舍五入问题的详细解析

引用
CSDN
1.
https://blog.csdn.net/qq_73814284/article/details/127334155

本文将深入探讨C语言中float类型的四舍五入问题,从实际编程问题出发,分析float类型在计算机中的存储精度问题,并提供自定义方法和库函数实现四舍五入的解决方案。

1. 关于float函数四舍五入的思考

1.1 float函数不符合预期的输出

在牛客网做题时,作者发现了一个关于float类型四舍五入的问题。具体表现为:

  • 保留一位小数时,4.455正确保留成了4.5
  • 保留两位小数时,2.445却出现了不同的结果

1.2 调试及解决方法

经过调试发现,问题的根本原因在于float类型在计算机中不能精确存储。例如,2.445可能被存储为2.44499997844或2.44500045123。因此,在保留N位小数时,如果第N+1位是5,结果会有所不同。

2. 不适用库函数,自定义解决四舍五入问题

2.1 关于正数四舍五入的整数取法

对于正数,可以使用以下方法实现四舍五入:

#include<stdio.h>
int main()
{
    float a=3.4;
    float b=3.6;
    printf("%d,%d",(int)(a+0.5),(int)(b+0.5));
    return 0;
}

2.2 关于正数任意小数位的四舍五入取法

对于需要保留N-1位小数的情况,可以采用以下方法:

#define  _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
    float x = 2.71828;
    printf("%f", (int)((2.71828 * 1000) + 0.5) / 1000.0);
    return 0;
}

2.3 归纳负数的正数及其任意小数位的四舍五入取法

对于负数,可以使用以下方法:

#define  _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
    float x=-19.99 ;
    printf("%d", (int)(x- 0.5));
    return 0;
}

3. 使用库函数,解决四舍五入问题

C语言提供了<tgmath.h>头文件,其中包含以下函数:

  • ceil:向上取整
  • floor:向下取整
  • round:四舍五入

使用这些函数时,需要确保变量类型为浮点数类型(float、double、long double)。

总结

  • 使用float函数保留小数时,如果恰好下一位是5,需要特别注意,可以使用%.10f进行调试。
  • 不使用库函数时,可以通过自定义方法实现四舍五入。
  • 使用库函数时,需要引入<tgmath.h>头文件,并正确使用这些函数。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号