setprecision后是要四舍五入吗?

先说问题:

Description

设圆半径r,圆柱高h 求圆周长C1、圆面积Sa、圆球表面积Sb、圆球体积Va、圆柱体积Vb。用scanf输入数据,输出计算结果,输出时要求文字说明,取小数点后两位数字。请编程序。 PI=3.14

Input

两个浮点数,r和h

Output

圆周长C1、圆面积Sa、圆球表面积Sb、圆球体积Va、圆柱体积Vb。保留两位小数,每个结果后换行。

Sample Input

1.5 3

Sample Output

C1=9.42
Sa=7.07
Sb=28.26
Va=14.13
Vb=21.19

HINT

 浮点数请用float类型

有学生找我,说她提交时,平台给出的Vb=21.20,致使提交总不能AC。

我给出解答:

#include<iostream>
#include<iomanip>
using namespace std;
#define PI 3.14
int main()
{
	float r,h,C1,Sa,Sb,Va,Vb;
	cin>>r>>h;
	C1=PI*2*r;
	Sa=PI*r*r;
    Sb=PI*4*r*r;
	Va=PI*4/3*r*r*r;
	Vb=PI*r*r*h;
	cout<<setiosflags(ios::fixed);
	cout<<setprecision(2);  //这个地方设置小数点后位数
	cout<<"C1="<<C1<<endl;
	cout<<"Sa="<<Sa<<endl;
	cout<<"Sb="<<Sb<<endl;
	cout<<"Va="<<Va<<endl;
	cout<<"Vb="<<Vb<<endl;
	return 0;
}

还好,脸算比较大,就用输入样例测试,AC了。

输入

1.5 3

输出

C1=9.42
Sa=7.07
Sb=28.26
Va=14.13
Vb=21.19

将上面的程序中设置小数点后的第15行修改一下:

	cout<<setprecision(5);  //这个地方设置小数点后位数

再用相同的输入运行,得到如下结果,但疑问也因此而产生(见括号):

C1=9.42000
Sa=7.06500(对照 上面的7.07,是书上说的四舍五入了)
Sb=28.26000
Va=14.13000
Vb=21.19500(再对照上面的21.19,这又是为何?)

再用一组测试数据,以及将变量型改为double,结果如下:

float r,h,C1,Sa,Sb,Va,Vb;

double r,h,C1,Sa,Sb,Va,Vb;

setprecision(2)


1.5 3(输入)

C1=9.42

Sa=7.07

Sb=28.26

Va=14.13

Vb=21.19

 

1.31 4.1(输入)

C1=8.23

Sa=5.39

Sb=21.55

Va=9.41

Vb=22.09


1.5 3(输入)

C1=9.42

Sa=7.07

Sb=28.26

Va=14.13

Vb=21.20

 

1.31 4.1(输入)

C1=8.23

Sa=5.39

Sb=21.55

Va=9.41

Vb=22.09

setprecision(5)


1.5 3(输入)

C1=9.42000

Sa=7.06500

Sb=28.26000

Va=14.13000

Vb=21.19500

 

1.31 4.1(输入)

C1=8.22680

Sa=5.38855

Sb=21.55421

Va=9.41201

Vb=22.09307


1.5 3(输入)

C1=9.42000

Sa=7.06500

Sb=28.26000

Va=14.13000

Vb=21.19500

 

1.31 4.1(输入)

C1=8.22680

Sa=5.38855

Sb=21.55422

Va=9.41201

Vb=22.09307

可以发现,仅仅在变量为float型,输入是1.5 3时,Vb值不是四舍五入的。原因在哪里?

时间: 2024-10-22 14:41:48

setprecision后是要四舍五入吗?的相关文章

java中浮点数的比较(double, float)(转)

  问题的提出:如果我们编译运行下面这个程序会看到什么? public static void main(String args[]){ System.out.println(0.05+0.01); System.out.println(1.0-0.42); System.out.println(4.015*100); System.out.println("BigDecimal:"+new BigDecimal(Double.toString(4.015)).multiply(new

用Round函数让四舍五入变的更精确

在前面,我们介绍了,利用INT函数来构造四舍五入函数的方法,但是,有时候我们会遇到更多小数位的四舍五入,用INT函数构造就会有些吃力了,Excel的Round函数可以帮助我们.Round函数的作用是返回某个数字按指定位数取整后的数字.语法为"ROUND(number,num_digits)",其中Number是需要进行四舍五入的数字;Num_digits为指定的位数,按此位数进行四舍五入,如果 num_digits 大于 0,则四舍五入到指定的小数位,如果 num_digits 等于

在业务系统中处理小数精度, 四舍五入,全舍弃,全进位的方法

在业务系统中,不同的客户对小数的处理有不同的方法 通过在设置保留的小数位数,以及小数位数以后的尾数的处理方法,可以灵活的满足客户要求 处理方法表  ID NUMBER(1)    ,                                                       --设置ID AMOUNTDOT      NUMBER(4,2) DEFAULT 0.01,  --金额精确度 1: 精确到元  0.1:精确到角  0.01:精确到分ROUNDING       NUMB

ASP 四舍五入FormatNumber函数用法

  ASP里面的Round函数都说是专一四舍五入的函数,不过FormatNumber函数也可以实现几乎等同于四舍五入的功能,经测试,FormatNumber还要比Round更准确.FormatNumber函数主要是用于对数字.货币.百分比数据作格式化处理,比如可以把35569.5867变换成35569.59,所以用它来四舍五入相当不错.下面来说如何使用FormatNumber函数. FormatNumber(Expression [, Digit [, LeadingDigit [, Paren

excel怎么使用四舍五入数字函数

  excel使用四舍五入数字函数的步骤 打开[excel],添加需要处理的数据. 再需要整理的数据后添加函数Round. 按要求设置需要保留的小数位数. 最后数据处理为所需的样式.

如何解除WPS表格四舍五入功能

  1.首先我们打开wps表格,然后右击单元格===设置单元格格式===选择"常规"确定 2.然后我们可以点击"开始"菜单,然后再我们工具栏上有这么一个按钮"增加小数位数" 通过以上设置后,大家就可以放心输入精确的金额等数据,而不用担心被WPS表格自动进行四舍五入,有需要的朋友赶紧使用以上方法进行操作,更方便使用WPS表格进行办公.

巧用WPS移动版组合函数四舍五入保留两位小数

平时用WPS移动版编辑表格时发现,在统计数据过程中,很多情况下要将数字四舍五入到小数点后两位小数.利用"单元格格式设置"则不能实现四舍五入.在WPS移动版中,要将数字自动四舍五入,需要使用Round 函数,其公式为:Round (number, num_digits),即指返回按指定位数进行四舍五入的数值.一起来学习吧. 阿mo打开一个利润统计表,四个部门的产品销售利润已经列举在内.下面向大家介绍如何借助WPS移动版得出平均利润,并且各平均利润值要自动四舍五入到两位小数. 其实,阿mo

Excel教你实现数据的四舍五入

  在Excel中的"四舍五入"函数-ROUND函数它可以返回某个数值按指定位数四舍五入后的数值.只要在Excel提供的"数学与三角函数"中找到这个名为ROUND(number,num_digits)的函数.这个函数有两个参数分别是number和num_digits.其中number就是将要进行四舍五入的数值(或用公式计算的结果)num_digits则是希望得到的数值的小数点后的位数.

Excel软件真正的实现四舍五入

  在我们日常的实际工作中,特别是在Excel的单元格格式中允许定义小数位数,但是在实际操作中我们发现,其实数字本身并没有真正实现四舍五入.如果采用这种四舍五入的方法,在财务运算中常常会出现误差,而这是财务运算所不允许的. 如图1,A1:A5是原始数据,B1:B5是通过设置单元格格式,对其保留两位小数的结果.C1:C5是把A1:A5的原始数据先四舍五入后,再输入的数据.而A6.B6.C6是分别对上述三列数据"求和"的结果.我们先看B列和C列,同样的数据,求和后居然得出了不同的结果.再观