从本实例学到什么

  1. 浮点数与实数的关系
  2. 浮点数的存储误差

实例程序代码

#例2-4-2  浮点数
print("0.1 + 0.1 = ", 0.1 + 0.1)
print("0.1 - 0.1 = ", 0.1 - 0.1)
print("0.1 * 0.1 = ", 0.1 * 0.1)  #计算机无法精确存储0.01,存储了它的近似值。
print("0.1 / 0.1 = ", 0.1 / 0.1)

a = 0.2
b = 0.1
print("a + b = ", a + b)  #计算机无法精确存储0.3,存储了它的近似值。

#对大多数实数,计算机都无法精确存储。这造成误差。
#在用计算机解决实际问题时,要考虑上述误差的积累。

运行例2-4-2,输出以下内容:

0.1 + 0.1 = 0.2
0.1 - 0.1 = 0.0
0.1 * 0.1 = 0.010000000000000002
0.1 / 0.1 = 1.0
a + b = 0.30000000000000004

读者肯定看到了输出内容中的第3行和第5行的特别之处。下面我们会解释为啥会出现这样的情况。

浮点数与实数的关系

Python语言用浮点数来表示数学上的实数(整数除外)。C/C++, Java以及其他很多语言都这么做。
何谓“浮点数”?是指小数点的位置会浮动的表示方法。与之相对的是“定点数”,是指小数点的位置固定的表示方法。整数的表示方法中,小数点固定在最低位的右侧。

浮点数和实数的区别是:浮点数必须是有限位的;而实数可以是无限位的。你能造出一台能够存储无限位的实数的计算机么?
那么,要存储无限位的实数,该怎么办?比如存储圆周率,该怎么办?答案是,保留小数点后的若干有效位,比如21位,忽略其后的数字。这样,就带来精度上的误差。

浮点数的存储误差

计算机能精确存储0.1吗?答案是,不能。
你会问,为啥不能?又不是有无限位,为啥不能?呃,计算机是用二进制来存储你心里想着的十进制小数。0.1是十进制小数,转换成二进制小数后,二进制小数是无限位的。
计算机能精确存储0.01吗?答案是,不能。只能存储0.01的近似值。
计算机能精确存储0.3吗?答案是,不能。只能存储0.3的近似值。
这就能够解释为什么输出内容中的第3行输出的积不是0.01,而是0.010000000000000002。后者正是前者的近似值。也能解释为什么输出内容中的第5行输出的和不是0.3,而是0.30000000000000004。
对多数实数,计算机都无法精确存储。这造成误差。在用计算机解决实际问题时,要考虑上述误差的积累。

小结

  1. Python语言用整数类型来表示数学上的整数,用浮点数类型表示数学上的实数(整数除外)。
  2. 浮点数与实数的区别:浮点数必须是有限位的,而实数可以是无限位的。
  3. 计算机会把你心里想的十进制小数转换为二进制小数,然后在内存中存储二进制小数。
  4. 对多数实数,计算机都无法精确存储。这造成误差。在用计算机解决实际问题时,要考虑上述误差的积累。