为什么0.1无法被二进制小数精确表示?
这个问题困扰了我不少时间,最近有个比较清晰的认识,和大家分享。
这个问题首先要从数位表示法说起。今天我们看到的 123 这样的十进制数,是自然而然的理解其意义,但是有没有深究其内在的数学原理呢?
所谓十进制是 \(0 \dots 9\) 十个基本符号为基础的一种数字表示法,数位表示法是将一串基本符号从左到右连续排列的一种方法。为什么 12 是表示一十二,而不是二十一,或者是一加二的意思呢?因为数字所处的位置是有特别意义的,最右边第一个数字符号,代表基本的数 \(0 \dots 9\),而第二位的意义并不是 \(0 \dots 9\),而是 \(0 \times 10 \dots 9 \times 10\)。推而广之,百位是 \(x \times 100\),(x是符号),用简练的数学公式就是 \(x \times 10^k\) , 个位 k 是 0,十位是 1,百位 k 是 2,从右到左一直数下去。123 的意思就是 \(1 \times 10^2+2 \times 10^1+3 \times 10^0\)。
位置,进制,符号这三者的关系就是“123”这种数字表示法内在的数学原理。
那么,0.1 是什么意思?是 \(1 \times 10^{-1}\),向右数数的结果。小数点是为了区分个位的位置在哪里。
一个数要用“数位表示法”表示出来,必然需要能够化为 \(x \times 10^k\) 的形式,而并不是任意数都能够做到。从数位法小数的定义看可以得知,一个数要能够被表示出来,需要能除尽 10,才有若干个 \(x \times 10^k\) 的数位组合表示它,否则就是无数个符号才能表示。如 \(1 \over 3\) 这个数除以 10 等于 \({1 \over 3} \times {1 \over 10} = 0.0333333 \dots\) 循环小数。
究竟哪些数可以用十进制表示哪些不可以?如分母是 10 的因子和因子的合数,如 1,2,5,10,20,50 等(整数分母为 1,而任意大于 1 的数的因子都有 1 和自身,因此整数可以用任意数制精确表示)。
回答题目,为什么 0.1 无法被二进制小数表示,0.1 即 \(1 \over 10\) 这个数要转换成二进制即 \(x \times 2^k\) 的组合数,必须要除尽 2.要注意,2 进制只有 0、1 两个符号,另一个需要注意,二进制被除数右移一位等于 \(\times 2\),而非十进制的 \(\times 10\)。
\({1\over 10} \times {1 \over 2} = {1 \over 20}\)
\(1 \times 2 \times 2 \times 2 \times 2 \times 2 = 32\) 右移5位
\(32-20 = 12\) 商1
\(12 \times 2 = 24\) 右移1位
\(24-20 = 4\) 商1
\(4 \times 2 \times 2 \times 2 =32\) 右移3位
\(32-20 = 12\) 商1 可见数字重复了,循环小数无疑
即 0.00011001。
那么 2 进制能够表示哪些十进制小数,\(5 \over 10\),因为能约成 \(1 \over 2\),分母是 2 的因子。
总结一点,就是位置表示法有其自身的缺陷,并不能在有限的数位,表示众多有理数,这个时候,需要借助分数来帮忙,来避免位置表示法以固定数作分母这个缺点。
如果需要一个可以避免循环小数的数制,不妨试用210进制,因为因子比较多,\(2 \times 3 \times 5 \times 7 =210\).
补充 2023-07-12: