3.1 浮点数
优质
小牛编辑
129浏览
2023-12-01
上一章我们曾遇到处理非整型数的问题。我们使用百分数代替小数,避开了这个问题。然而还有一种更通用的解决方案,即使用浮点数,可以同时表示小数和整数。C++有两种浮点类型:float和double,本书仅使用double型。 你可以创建浮点型变量并赋值,语法与使用其它数据类型一样。例如:
double pi;
pi = 3.14159;
声明变量同时赋值也是合法的:
int x = 1;
string empty = "";
double pi = 3.14159;
实际上这种语法形式很常用。声明和赋值的组合语法有时也称为初始化。 浮点数固然很有用,但也会带来混淆,因为整型数和浮点数之间可能有意义重叠。例如,1这个值,是一个整型数,还是一个浮点数,抑或二者都是? 严格来说,C++区分整型的1和浮点型的1.0。尽管二者看似同一个数,但属于不同类型,严格意义上不允许类型间的赋值。下面语句是非法的:
int x = 1.1;
因为赋值运算符左边是整型变量,而右边是浮点型值。但是由于C++具有自动转换数据类型的特性,让你很容易就忘掉了这一规则。例如:
double y = 1;
严格来讲这也是非法的,但C++允许这么做,它会自动把int类型转换为double类型。这种放宽的限制带来便利的同时,也带来了问题,如:
double y = 1 / 3;
你可能以为此表达式给变量y的值会是一个合法浮点数0.333333,但实际上y的值却是0.0。原因是:赋值运算符右边的表达式实际上是两个整型值之比,所以C++做的是整型除法,使得此值为0;再转换为浮点数,结果就是0.0。 解决这个问题(当你发现问题是什么时)的一个方法是把右边变成一个浮点数表达式:
double y = 1.0 / 3.0;
此式给y赋的值是0.333333,这才是期望结果。 到目前为止我们接触到的所有运算操作——加、减、乘、除——对浮点数都有效,然而其背后的运行机制是完全不同的,你也许有兴趣想了解这一点。实际上,大多数处理器有特定的硬件来执行浮点数运算。