C语言中的格式化打印 :
printf("%.2f",21.195);
输出是 21.20 四舍五入保留了
而变量和常变量 并不四舍五入:
float a=21.195 ;
const float b=21.195;
printf("%.2f \n %.2f",a,b);
输出为 21.19 并没有四舍五入,而是直接截断了
今天做一个很简单的实验的时候,测试用例有一个一直有问题,便揣测应该是精度问题:
先看题目:
正常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;
}
然后发现测试有问题:
题目要求通过的是 最后一个 Vb体积为 21.20 而PI是确定的3.14
那问题出在哪了呢?
于是我便不保留2位输出 把 “%.2f” 换为 “%f”
所以可知 C语言中的 格式化打印 %.2f 保留两位 对于变量和常变量 是直接割舍的 不是四舍五入
测试了Java的格式化输出 Java中的是四舍五入的
可以看到 Java中不管是实型常量、常变量还是变量输出都是四舍五入的
那要怎么解决四舍五入保留小数呢?
在计算体积的时候采用:添加这样一个方法来
v=(int)(v*100+0.5)/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;
}
#include
里提供了这么一个方法: round()
用例:
float a=3.1415926;
float b=round(a);
可得到 b=3
所以还是和方案一的思路一样
加一个:
v=round(v*10)/10.0;
即可,效果一样
总结一下,C语言中的格式化打印输出,对于实型常量和符号常量是能够四舍五入保留的,但对于变量和常变量却不行,但自己处理。