前两天发现一个很奇怪的现象
众所周知,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;
}