• C语言如何做到四舍五入保留小数


    C语言中的格式化打印 :

    • 例如:
     printf("%.2f",21.195); 
    
    输出是 21.20   四舍五入保留了
    
    • 1
    • 2
    • 3
    • 定义宏变量 #define 即符号常量 也能够四舍五入保留

    而变量和常变量 并不四舍五入:

    	float a=21.195 ;
    	const float b=21.195;
    	printf("%.2f \n %.2f",a,b);
    
     输出为 21.19   并没有四舍五入,而是直接截断了
    
    • 1
    • 2
    • 3
    • 4
    • 5

    在这里插入图片描述

    • 变量和常变量 不四舍五入
    • 宏定义符号常量和实型常量 要四舍五入

    今天做一个很简单的实验的时候,测试用例有一个一直有问题,便揣测应该是精度问题:

    先看题目:

    在这里插入图片描述
    在这里插入图片描述

    正常coding:

    #include
    #define PI 3.14
    
    int main(void)
    {
        /*********Begin*********/
        float r, h; //输入半径和高
        scanf("%f,%f", &r, &h);
        float c, s, v;
        c = 2 * r * PI;
        s = 4*PI*r*r;
        v = PI*r*r*h;
        
        int x = round(v);
        printf("C1=%.2f\n", c);
        printf("Sb=%.2f\n", s);
        printf("Vb=%.2f\n", v);
        /*********End**********/
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    然后发现测试有问题:
    在这里插入图片描述

    题目要求通过的是 最后一个 Vb体积为 21.20 而PI是确定的3.14

    那问题出在哪了呢?

    于是我便不保留2位输出 把 “%.2f” 换为 “%f”
    在这里插入图片描述
    所以可知 C语言中的 格式化打印 %.2f 保留两位 对于变量和常变量 是直接割舍的 不是四舍五入

    测试了Java的格式化输出 Java中的是四舍五入的

    在这里插入图片描述
    可以看到 Java中不管是实型常量、常变量还是变量输出都是四舍五入的

    那要怎么解决四舍五入保留小数呢?

    • 方案一:

    在计算体积的时候采用:添加这样一个方法来

    v=(int)(v*100+0.5)/100.0;
    
    • 1
    • 先将体积扩大100倍,
    • +0.5再把float类型强转为int类型即可达到四舍五入的效果,
    • 再除以100.0浮点数又自动转为浮点类型
    #include
    #include
    #define PI 3.14
    
    int main(void)
    {
        /*********Begin*********/
        float r, h;
        scanf("%f,%f", &r, &h);
        float c, s, v;
        c = 2 * r * PI;
        s = 4*PI*r*r;
        v = PI*r*r*h;
        v=(int)(v*100+0.5)/100.0;
        int x = round(v);
        printf("C1=%.2f\n", c);
        printf("Sb=%.2f\n", s);
        printf("Vb=%.2f\n", v);
        /*********End**********/
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 方案二:
    #include
     里提供了这么一个方法: round()
    
    用例:
    	float a=3.1415926;
    	float b=round(a);
    
    可得到 b=3
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    所以还是和方案一的思路一样
    加一个:

    v=round(v*10)/10.0;
    
    • 1

    即可,效果一样


           总结一下,C语言中的格式化打印输出,对于实型常量和符号常量是能够四舍五入保留的,但对于变量和常变量却不行,但自己处理。

  • 相关阅读:
    用于图像分类的预训练模型(PyTorch实现)
    grub 启动
    线性表操作的实现--顺序表
    CogView中的Word embeddings (parallel)
    工厂模式和单例模式
    Excel二维码图片生成器
    我用Devchat开发了公务员报名确认系统自动登录脚本,再也不用担心挤不进去了
    GBase 8c核心特性-分布式事务
    【PCBA方案】电子握力测试仪方案she‘ji
    JavaScript变量及数据类型
  • 原文地址:https://blog.csdn.net/Lov1_BYS/article/details/127772824