C++之Float类型, double类型

c++里的小数分为float和double两种类型, 这两种类型, 直接看代码, 及运行结果我们来看一下他们有什么区别:

#include "iostream"
using namespace std;

int main() {
	float tub = 10.0 / 3.0;
	double mint = 10.0 / 3.0;
	// 注意1.0E6之间不能有空格
	const float million = 1.0E6;
	
	cout << "tub = " << tub;
	// cout的默认输出是会把无效位(也就是末尾的0给去掉), 并可能
	// 采用科学计数法进行显示(这行代码就显示: “, a million tubs = 3.33333e+06”)
	cout << ", a million tubs = " << million * tub;
	// 这行代码就强制让cout输出原始数据例如:333333.250000
	cout.setf(ios_base::fixed, ios_base::floatfield);
	cout << ", after translate a million tubs = " << million * tub;
	cout << ", \n and ten million tubs = ";
	cout << 10 * million * tub << endl;
	
	cout << "mint = " << mint << " and a million mints = ";
	cout << million * mint << endl;
	return 0;
}

再来看代码的运行结果:

接下来分析一下代码, 代码逻辑很简单, 这里只说一行:

cout.setf(ios_base::fixed, ios_base::floatfield);

这行代码就强制让cout输出原始数据例如:333333.250000, 而不是cout默认的那种输出3.33333e+06这种格式, 仅仅是为了好对float和double的结果进行对比

通过运行结果我们能看的出来:

tub 和 mint还都算是精确, 但是把他们放大1000000后发现tubs已经不精确了, 而mints还算是精确, 

我们可以看出来, 在该系统中,  将tub*1000000后的结果为3333333.250000, 也就是不再精确, 但是保证了7位有效位, 也就是小数点后能保证6位是精确的(如果tub * 1000000 * 10 结果就更不精确了, 说明了float的精确度是有限的), 与之相比, double能至少保证13位是有效的,  因此相比而言double更精确一点.
在程序中默认情况下1.23和1.23E8都存储为double类型(个人觉得是更精确), 如果希望常量存储为float类型, 需要在常量后面加上f或F, 例如1.23f, 如果要存储为long double类型, 则可以使用l或L后缀:

1.23f   float类型;     1.23E5F  float类型,   1.23E4 double类型,   1.23L long double类型

 

我们再来看另一个例子:

#include "iostream"
using namespace std;

int main() {
	float a = 1.23E10;
	float b = a + 1.0f;
	
	cout.setf(ios_base::fixed, ios_base::floatfield);
	cout << "a = " << a << endl;
	cout << "b = " << b << endl;
	cout << "b - a = " << b - a << endl;
}

运行结果:

从这里虽然b比a多了1, 但是由于float只能精确到第6, 7位, 所以多加的1对于b来说等于没有, 因此他们的相减的结果为0,  这也进一步说明了float的不精确

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值