C/C++手动四舍五入保留k位小数

前两天发现一个很奇怪的现象
众所周知,printf可以格式化输出,保留指定小数位数 %.kf k是有效位数,并且是四舍五入的。但是,在include<stdio.h>include<iostream>两个不同的头文件下,却发生了一个很奇怪的现象。
实验环境DEV,编译器GCC
使用头文件stdio.h,正常的四舍五入

#include<stdio.h>
int main(){
	printf("不保留小数:%f\n",3.25);         //不保留小数:3.250000
	printf("保留一位小数:\n"); 
	printf("3.25: %.1f\n",3.25);           //3.25: 3.3
	printf("13.0/4: %.1f\n",13.0f/4);      //13.0/4: 3.3
	printf("3.20+0.05: %.1f\n",3.20+0.05); //3.20+0.05: 3.3
	printf("3.20+0.051: %.1f\n",3.20+0.051); //3.20+0.051: 3.3
	return 0;
}

把头文件换成iostream之后,出现了这样的结果,

#include<iostream>
int main(){
	printf("不保留小数:%f\n",3.25);			//不保留小数:3.250000
	printf("保留一位小数:\n"); 
	printf("3.25: %.1f\n",3.25);     		//3.25: 3.2
	printf("13.0/4: %.1f\n",13.0f/4); 		//13.0/4: 3.2
	printf("3.20+0.05: %.1f\n",3.20+0.05); 	//3.20+0.05: 3.2
	printf("3.20+0.051: %.1f\n",3.20+0.051); //3.20+0.051: 3.3
	return 0;
}

为什么生成iostream之后3.25就不是“五入”了呢,实在没搞明白。于是为了保险,收集整理了一下手动四舍五入的方案

将x四舍五入到k位小数

格式化输出时printf("%.kf")

方法一 用int强转
确保x是浮点类型,然后
x =1.0 * (int)(x * 10^k + 0.5)/10^k  
方法二 用round()函数

double round(double)函数是cmath标头的库函数,四舍五入地返回给定值距离最近的整数,但是返回值是double型。

确保x是浮点类型,然后
round(x * 10^k)/10^k
示例
#include<iostream>
#include<cmath>
int main(){
	printf("%.1f\n",1.0*(int)(3.25*10+0.5)/10); //3.3
	printf("%.1f\n",round(3.25*10)/10);     	//3.3
	return 0;
}
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值