发现一个奇怪的问题...

2017-11-30 10:14:11 +08:00
 yasumoto
1/3=0.3333333...
那么 1/3+1/3+1/3=0.9999999....
可是我们日常生活中 3 个 1/3 肯定是等于 1 的
1/3+1/3+1/3 到底等于 1 还是 0.9999999...啊

而且我发现在 js 里 ===不代表完全等于 如图

好奇怪啊
5648 次点击
所在节点    程序员
46 条回复
em84
2017-11-30 10:15:42 +08:00
o.999999...不就是等于 1
FreeEx
2017-11-30 10:21:51 +08:00
试试这个 console.log(1/3 + 1/3 +1/3);
xiubin
2017-11-30 10:23:10 +08:00
10x - x = 9

x = 0.99999...
10x = 9.99999...
10x - x = 9

x = 1
10x = 10
10x - x = 9

so: 0.999999... == 1

js 里出现什么我都是不奇怪的,因为我坚信 Swift 才是要统治世界的语言,2333333
Tink
2017-11-30 10:24:26 +08:00
有个东西叫微积分
changnet
2017-11-30 10:24:57 +08:00
浮点型精度问题,哪种语言都有啊
hsuan
2017-11-30 10:25:00 +08:00
楼主高中生吧,没学过极限的概念?
zhx1991
2017-11-30 10:25:17 +08:00
1=0.9 的循环

不懂的人应该重上一下大学的数学课

计算机没有无限循环的说法
mengzhuo
2017-11-30 10:26:10 +08:00
@xiubin #3 好好学计算机基础,整数和浮点是有区别的。跟什么语言没有关系。
dangoron
2017-11-30 10:29:38 +08:00
额。。同学估计没学过数值运算?数字化之后有精度损失的
10 * 0.999999 … - 0.999999 … = 9 * 0.999999 … = 9.999999 … - 0.999999 … = 9
1 = 0.999999 … 这是在循环小数能循环到无限低位才成立的,数值化之后自然不成立了。js 浮点数的值不精确导致===结果很奇怪
Navee
2017-11-30 10:34:07 +08:00
你要考虑到计算机语言浮点类型数据的精度。
zhengxiaowai
2017-11-30 10:39:42 +08:00
听过 ieee 754 么,绝大多数的语言的浮点数都是用这个标准的
xiubin
2017-11-30 10:47:46 +08:00
@mengzhuo #8 请先生为我解惑
mengzhuo
2017-11-30 11:00:47 +08:00
@xiubin #12

我之前学计算机原理的时候也不是很清楚,直到看到这位教授的课程
<amp-youtube data-videoid="1qOCLMTaKdU" layout="responsive" width="480" height="270"></amp-youtube>&index=9&list=PLbtzT1TYeoMgzLyE9n-pJrTFZX18EUKw_

简单的说,有限的计算机对无限的小数无解,一切都只是近似
DOLLOR
2017-11-30 11:11:01 +08:00
这是很典型的浮点精度丢失问题,所有语言都会有的。
araraloren
2017-11-30 11:17:40 +08:00
Come to Perl6


say 1/3 + 1/3 + 1/3 == 1; # True


run code: https://ideone.com/gjoXOP
xiubin
2017-11-30 11:22:39 +08:00
@mengzhuo #13 thanks,我只知道浮点类型精度丢失会不准确,但是不知道居然还有这种问题
Panic
2017-11-30 11:27:24 +08:00
难道不是高数问题吗
clino
2017-11-30 11:35:19 +08:00
0.9999999.... 就是 1
因为 1- 0.9999999.... 的结果 0.000000.... 这后面一直是 0 没有任何其他数的,所以就是 0
yasumoto
2017-11-30 11:42:53 +08:00
@clino 那 1.999999...8 等于 2 吗
nullcoder
2017-11-30 11:46:14 +08:00
第一个问题参考高数的极限概念
13 楼的视频对第二个问题应该很有帮助
简单说,就是有限位的二进制的小数不能表示所有十进制的小数
比如十进制的 0.2,二进制就是无限小数。如果你了解十进制二进制转换。
常见的一个例子就是 0.1 + 0.2 != 0.3

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/410724

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX