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

本文探讨了C语言中浮点数在格式化输出时不会自动四舍五入的问题,并通过实例展示了宏定义常量和变量在%.2f格式化时的区别。提出了两种解决方案,一种是利用乘法和除法实现四舍五入,另一种是使用round()函数。同时,对比了Java中的四舍五入行为。
摘要由CSDN通过智能技术生成

C语言中的格式化打印 :

  • 例如:
 printf("%.2f",21.195); 

输出是 21.20   四舍五入保留了
  • 定义宏变量 #define 即符号常量 也能够四舍五入保留

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

	float a=21.195 ;
	const float b=21.195;
	printf("%.2f \n %.2f",a,b);

 输出为 21.19   并没有四舍五入,而是直接截断了

在这里插入图片描述

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

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

先看题目:

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

正常coding:

#include<stdio.h>
#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;
}

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

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

那问题出在哪了呢?

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

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

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

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

  • 方案一:

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

v=(int)(v*100+0.5)/100.0;
  • 先将体积扩大100倍,
  • +0.5再把float类型强转为int类型即可达到四舍五入的效果,
  • 再除以100.0浮点数又自动转为浮点类型
#include<stdio.h>
#include<math.h>
#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;
}
  • 方案二:
#include<math.h>
 里提供了这么一个方法: round()

用例:
	float a=3.1415926;
	float b=round(a);

可得到 b=3

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

v=round(v*10)/10.0;

即可,效果一样


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

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

苗半里

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值