“数”学--迷之0.999...

半年前,偶然留意到一个奇怪的现象 1/3*3=1 而 0.333...*3=0.999... ,当中差了一个非常小的数 0.000...1。一直百思不得其解。

而最近发现更为离奇的是,2/5+3/5=1,0.4+0.6=1,这个在十进制中完美无懈,但是转换到二进制后(人工转换,不存在计算机符点数不精确的问题)

十进制分数 十进制小数 二进制分数 二进制小数
1/5 0.2 1/101 0.001100110011...
2/5 0.4 10/101 0.0110011001100...
3/5 0.6 11/101 0.1001100110011..
4/5 0.8 100/101 0.110011001100...
5/5 1.0 101/101 0.111... 还是 1.0 ??

同一个数在不同进制中居然不一样?

这就是一个很奇怪的问题了,为什么相同的数转换成小数后,不同的进制居然会出现不同的结果。那是不是说人类如果是以八进制或者十六进制的,那跟现在的十进制的科技发展都不一样了??我们知道,十进制中,除数只含2和5因数的能够除尽,即不产生无限循环小数。而如果是二进制,则除数只含2才能除尽。(这里原因是跟小数点的移位相关,请自行百度不具体展开讲)这样的话不同的进制,就因为有的化为有限,有的化为无限,同样的数加起来结果却不相同。

同样的道理我们再回到1/3与0.333...的问题上,如果是使用三进制的话,1/3直接就等于0.1了,3*0.1=1却完全正确。问题到底出在哪里呢?

1/3与0.333...

一步步来debug,我们先来看看 1/3化为小数0.333...这一步有没有问题。怎么看呢?我们日常的除法转换步骤因为太习以常了,很难发现其中有没有bug。那么就从结果反推吧

  0.333... = 0.3+0.03+0.003+...+0.00...3

= 3/10+3/100+...+3/10n

= 3*(1/10+1/100+1/1000+...1/10n)

= 3*( 10n-1/10n + 10n-2/10n + 10n-3/10n + ... +100/10n)

= 3*( ((10n - 1)/9 )/10n )   等比求和公式

= 1/3 * (1-1/10n)

= 1/3 - 1/(3*10n)  (n→∞)

意外地发现,原来0.333...其实并不等于1/3,也就是说我们在分数转换成小数的时候,对于无限循环小数的省约写法其实是有误差的!

具体误差在哪里?那就再仔细把小学学的除法演算一遍:

  1÷3 = 0.9÷3 + 0.1÷3

= 0.3 + 0.1÷3 = 0.3+(0.09+0.01)÷3

= 0.33 + 0.01÷3 = 0.33+(0.009+0.001)÷3

= 0.333 + 0.001÷3

=  。。。

而我们在除法取无限循环小数的时候,其实只是取了前半部分,后面的那项却被忽略了,后面那项是什么呢?仔细观察你会发现其实就是1/10n÷3   (n→∞)

通过反推和正推,都发现确实是有bug存在。所以 3*0.333... = 0.999... 其实是 3*[1/3 - 1/(3*10n)] = 1-1/10n    (n→∞)

这样就间接说明了0.999...≠1,而0.999... 与1所相差的 0.00...1 其实就是 1/10n   (n→∞)

可能有人会问 1/10n(n→∞)是否等于0呢?

最简单粗暴但有争议的证明是 1/10n * 10n = 1,而0乘以任何数都等于0不可能等于1,所以1/10n不是0 。对此也有网友持不同意见,认为这里的乘法跟极限lim所定义的乘法(若函数a、b存在极限,则 lim(a)*lim(b) = lim(a*b) )的意义并不一样。而且就算定义一样,0*∞也不能使用极限的四则运算法则来运算,即 lim(1/10^n)*lim(10^n) = lim( 1/10^n * 10^n)并不成立。由于此问题暂无定论,在此暂定这个数是一个问号

回顾到不同进制下数字的相加结果不同的问题,其实都是在转换成小数的时候人为所产生的误差。

引申问题:lim(1/x)*lim(x) (x→∞)是等于1吗?还是不能算?还是其它答案?(x→0)呢?x趋于其它值呢?

其他意见 及 我的反驳

有意思地在网上发现另外一些看法,并给出了看似无懈可击的反例。为节省不必要的重写,这里的 n 全部都在后面加上(n→∞),不再啰嗦。

1)大卫·福斯特·华莱士(David Foster Wallace)在他的 《Everything and More》一书中介绍了另外一个著名的证明:

令 x = 0.999...
所以 10x = 9.999...
两式相减得 9x = 9
所以 x = 1
这一条一目了然,大多数人都觉得无可反驳,但其实是一叶障目。我在同学李源康的提醒下 醒悟,请问 10x=9.999... 这个是怎么得出来的?说不定是 10x=9.99...0 呢?可谓一语点醒梦中人,直接来用极限写出来:
10 * 0.999... = 10 * (1 - 1/10n ) = 10 - 10/10n

而 9.999... 等于 10-1/10n , 这两者明显不相等,第二个所以就已经错了,最终结果当然也法得来。

 2)”x 不等于 y 等价于存在一个z严格介于x和y之间“

 0.999...与1之间有没有存在介于两者之间的值呢?化成极限表达式来看看,1-(1/10n) 与 1之间有没有,随手就能举一抄出来(把分母加大),中间是有无限个。那为什么从小数的形式没有看到呢?因为这已经在十进制小数的精度约束下了。为什么这么说呢?要是而弄成十六进制还有A到F呢。十六进制的0.FFF...,有没有比十进制的0.999...更接近1?要是100进制呢,更大的进制呢?

再从另外一个角度, 0.999...*2 = 1.999...8 也就是 (1-1/10n)*2=2-2/10n。这与2之间没有存在一个值介于它们之间吗?显然有,1.999...也就是2-1/10n。如果说0.999...与1之间没有值,那为什么同乘以2之后就会有了呢?

至此,网上所流传的证明0.999...完全等于1,而没有1/10n的差别的证明全部被否决。现在只剩下最后的一个未解疑问,如何证明1/10n 等于或者不等于 0。

如果。。。

如果你十分确信1/10n(n→∞)就是 0 ,那么以上讨论对你都没有用了,因为这样认为的话那无论有没有这个数意义都是一样。这样的话就相当于确认了从分数到无限小数(如1/3 --> 0.333...) 的转化之间的 人为误差 对实际结果是没有任何影响的。疯狂的世界,谁知道呢?

参考资料

1、百度百科 《0.999...》

2、果壳网 《最让人纠结的等式:0.999...=1》

原文地址:https://www.cnblogs.com/batsing/p/0_999.html