
第5课 这面积总缺那么一点(浮点数数据类型)

掌握计算后,我设计了计算三角形和梯形面积的程序,但是发现面积的计算结果总是会少了那么一点。
为什么面积总会缺一点呢?想要解决这个问题需要先编写出计算三角形和梯形面积的程序。

温故知新
(1)三角形面积=底×高÷2。

运行程序:
请输入三角形的底边长? 7 请输入三角形的高? 5 三角形的面积是: 17
实际上,三角形的面积是17.5。

(2)梯形面积=(上底+下底)×高÷2。

运行程序:
请输入梯形的上底? 5 请输入梯形的下底? 8 请输入梯形的高? 3 梯形的面积是: 19
实际上,梯形面积是19.5。

area = (upperSole + bottom) * height / 2:程序计算也是先乘除后加减,遇到括号先计算括号里的内容。
提出思考
为什么这两次面积计算都少了0.5呢?遇到问题,不要急于翻书查找答案,探索和思考出答案的过程要比答案本身更重要。

(1)想一想,计算结果和什么有关?①存放数字的变量;②计算的式子。
(2)想一想,变量都是什么数据类型?
(3)看一看,计算式子有没有什么特别的?
探索思考
当我们遇到一个疑问的时候,要“上下求索”。从上寻求和这个问题有关联的部分,列出导致这样的结果的可能;向下探寻这个问题可能引出的变化,列出这些变化。然后逐一分析。
我发现最关键的可能是变量被声明为int类型,即声明的是整数类型,而缺少的部分都是小数部分。整数是不包含小数部分的,所以小数部分就出不来了。

float浮点数
把变量声明为float数据类型。

运行程序:
请输入三角形的底边长? 7 请输入三角形的高? 5 三角形的面积是: 17.5

float称为浮点数数据类型(单精度),用于存储实数值,即含有小数的值。如果你需要更高的精度,可以选择double数据类型,它被称为双精度浮点数。
翻译助力理解
● float:浮动的、漂浮。
● double:两倍的,双的。
area = length * height / 2:将计算length * height / 2,并将计算出的结果赋值给area。在编程中,该语句中的=被称为赋值操作,是先进行等号右边的计算,再将最终的结果赋值给等号左边的变量。注意,这里的=不是等于的含义。
敲黑板
特别注意没输出的小数部分。

输出结果竟然是1。
虽然已经将num定义为浮点数,但在3/2的计算过程中,由于3和2都是整数,计算仍然是按照整数类型的方式进行,直到计算出结果1后才将它赋值给浮点数类型的变量num。
想要解决这个问题,需要在计算的过程中引入浮点数,让计算机按照浮点数来计算。
稍作改变,改为num = 3/2.0;,试试看吧。
降价促销
双十一到了,之前5元一瓶的牛奶迎来了大促销,现在4.8元一瓶,并且还买一送一,请问买32瓶需要多少钱?

巩固练习
(1)想要声明一个变量存放数值3.14,以下哪句代码可以做到?( )
A.float π
B.int π
C.float num
D.float 1num
(2)float被称为有小数部分数值的双精度浮点数。( )√( )×
(3)写出下面程序的运行结果。

探索思考
既然float可以保留数值的小数部分,而double数据类型的精度比float数据类型的精度还要高,那为什么每次声明变量的时候不都声明成double,这样不就可以避免一些小数的计算问题了吗?

计算机好比一个超级大的储存盒子,想像一下往盒子里放入3.14159265359和放3.14所需要的空间大小会一样大吗?
如果往盒子里放东西时没有做规划的话,就可能导致放不下或只能裁剪后再放入。
于是发明者就想到了声明,即每放入一个东西就要空出一块专门的位置,就像一个小盒子。但是每个小盒子要多大呢?这就取决于数据类型了。如果是int数据类型,就空出一个小点的盒子,如果是double数据类型,就空出一个大盒子。这样就可以充分利用空间,而且也不会造成空间的浪费。