洛谷历险记1(小数精确问题)

p1422

关于精度问题:要求最后的取值要精确到小数点后一位。

	//fea = ((int)((fea * 10) + 5 ))/10.0; 错误示范

	fea = int((fea * 10) + 0.5) / 10.0;

注释的一行是错误的代码

分析:例如最后得到的是一个1.05的double类型,1.05*10=10.5,再加5则影响了小数点后一位的精度,实则应该在小数点后的第二位增加,即增加0.5.

同时,还可以使用floor函数,即返回一个小于或等于该数的一个最大整数,正好用来去掉小数点后面的部分(需要引入cmath包)

fea = floor((fea * 10) + 0.5) / 10.0;

另解:添加头文件#include<iomanip>     该头文件可以用来设置输出的精度

#include <iostream>
#include <cmath>
#include <iomanip>

using namespace std;

int main() {
	
	double x = 1.28456;
	cout << fixed << setprecision(1);//fixed标识启用准确计数,setprecision则是设置精确度
	cout << x;
	return 0;
}

p1085

关于如何去获取int的最大值:

unsigned int a = 0;

int MAX = (~a)/2;

分析:无符号数0的二进制位全0,取反后为全1,再除以二则右移,得到首位为0,其一皆是1的二进制数。(取反操作不会变化变量类型,仅仅将其按位变化,而无符号数的算术右移则首位补0

习得ceil函数!返回一个大于或等于该数的最小整数

temp = ceil (n*1.0) / a[i];

 

注意:对于符号类型强转,存在其优先级:,在该例子中是现将后面括号内的部分强转为int,再进行除法操作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值