为什么0.1无法被二进制小数精确表示?

这个问题困扰了我不少时间,最近有个比较清晰的认识,和大家分享。

这个问题首先要从数位表示法说起。今天我们看到的 123 这样的十进制数,是自然而然的理解其意义,但是有没有深究其内在的数学原理呢?

所谓十进制是 09 十个基本符号为基础的一种数字表示法,数位表示法是将一串基本符号从左到右连续排列的一种方法。为什么 12 是表示一十二,而不是二十一,或者是一加二的意思呢?因为数字所处的位置是有特别意义的,最右边第一个数字符号,代表基本的数 09,而第二位的意义并不是 09,而是 0×109×10。推而广之,百位是 x×100,(x是符号),用简练的数学公式就是 x×10k , 个位 k 是 0,十位是 1,百位 k 是 2,从右到左一直数下去。123 的意思就是 1×102+2×101+3×100

位置,进制,符号这三者的关系就是“123”这种数字表示法内在的数学原理。

那么,0.1 是什么意思?是 1×101,向右数数的结果。小数点是为了区分个位的位置在哪里。

一个数要用“数位表示法”表示出来,必然需要能够化为 x×10k 的形式,而并不是任意数都能够做到。从数位法小数的定义看可以得知,一个数要能够被表示出来,需要能除尽 10,才有若干个 x×10k 的数位组合表示它,否则就是无数个符号才能表示。如 13 这个数除以 10 等于 13×110=0.0333333 循环小数。

究竟哪些数可以用十进制表示哪些不可以?如分母是 10 的因子和因子的合数,如 1,2,5,10,20,50 等(整数分母为 1,而任意大于 1 的数的因子都有 1 和自身,因此整数可以用任意数制精确表示)。

回答题目,为什么 0.1 无法被二进制小数表示,0.1 即 110 这个数要转换成二进制即 x×2k 的组合数,必须要除尽 2.要注意,2 进制只有 0、1 两个符号,另一个需要注意,二进制被除数右移一位等于 ×2,而非十进制的 ×10

110×12=120
1×2×2×2×2×2=32 右移5位
3220=12 商1
12×2=24 右移1位
2420=4 商1
4×2×2×2=32 右移3位
3220=12 商1 可见数字重复了,循环小数无疑

即 0.00011001。

那么 2 进制能够表示哪些十进制小数,510,因为能约成 12,分母是 2 的因子。

总结一点,就是位置表示法有其自身的缺陷,并不能在有限的数位,表示众多有理数,这个时候,需要借助分数来帮忙,来避免位置表示法以固定数作分母这个缺点。

如果需要一个可以避免循环小数的数制,不妨试用210进制,因为因子比较多,2×3×5×7=210.

补充 2023-07-12:

11×25=3212×21=244×23=3212202020=0.00011001

2013212520241221203242320120.00011001

posted @   诺贝尔  阅读(14562)  评论(6编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
点击右上角即可分享
微信分享提示