V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
yasumoto
V2EX  ›  程序员

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

  •  
  •   yasumoto · 2017-11-30 10:14:11 +08:00 · 5607 次点击
    这是一个创建于 2550 天前的主题,其中的信息可能已经有所发展或是发生改变。
    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 里 ===不代表完全等于 如图

    好奇怪啊
    46 条回复    2017-12-01 13:28:19 +08:00
    em84
        1
    em84  
       2017-11-30 10:15:42 +08:00
    o.999999...不就是等于 1
    FreeEx
        2
    FreeEx  
       2017-11-30 10:21:51 +08:00
    试试这个 console.log(1/3 + 1/3 +1/3);
    xiubin
        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
        4
    Tink  
       2017-11-30 10:24:26 +08:00
    有个东西叫微积分
    changnet
        5
    changnet  
       2017-11-30 10:24:57 +08:00 via Android
    浮点型精度问题,哪种语言都有啊
    hsuan
        6
    hsuan  
       2017-11-30 10:25:00 +08:00
    楼主高中生吧,没学过极限的概念?
    zhx1991
        7
    zhx1991  
       2017-11-30 10:25:17 +08:00
    1=0.9 的循环

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

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

    我之前学计算机原理的时候也不是很清楚,直到看到这位教授的课程
    &index=9&list=PLbtzT1TYeoMgzLyE9n-pJrTFZX18EUKw_

    简单的说,有限的计算机对无限的小数无解,一切都只是近似
    DOLLOR
        14
    DOLLOR  
       2017-11-30 11:11:01 +08:00 via Android
    这是很典型的浮点精度丢失问题,所有语言都会有的。
    araraloren
        15
    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
        16
    xiubin  
       2017-11-30 11:22:39 +08:00
    @mengzhuo #13 thanks,我只知道浮点类型精度丢失会不准确,但是不知道居然还有这种问题
    Panic
        17
    Panic  
       2017-11-30 11:27:24 +08:00
    难道不是高数问题吗
    clino
        18
    clino  
       2017-11-30 11:35:19 +08:00
    0.9999999.... 就是 1
    因为 1- 0.9999999.... 的结果 0.000000.... 这后面一直是 0 没有任何其他数的,所以就是 0
    yasumoto
        19
    yasumoto  
    OP
       2017-11-30 11:42:53 +08:00
    @clino 那 1.999999...8 等于 2 吗
    nullcoder
        20
    nullcoder  
       2017-11-30 11:46:14 +08:00
    第一个问题参考高数的极限概念
    13 楼的视频对第二个问题应该很有帮助
    简单说,就是有限位的二进制的小数不能表示所有十进制的小数
    比如十进制的 0.2,二进制就是无限小数。如果你了解十进制二进制转换。
    常见的一个例子就是 0.1 + 0.2 != 0.3
    victor97
        21
    victor97  
       2017-11-30 11:49:31 +08:00 via Android
    楼主的第一个问题是数学问题。0.99999999 无限循环,就是 1
    但这个问题不能用代码验证…因为计算机浮点类型会损失精度。
    qiayue
        22
    qiayue  
       2017-11-30 11:56:08 +08:00
    @yasumoto 你最后是 8,那么你一定知道中间有多少个 9,这并不是一个无限小数,所以并不等于 2
    yasumoto
        23
    yasumoto  
    OP
       2017-11-30 12:05:25 +08:00
    @qiayue 我知道最后是 8 不一定非要知道中间有多少 9 把
    clino
        24
    clino  
       2017-11-30 12:07:16 +08:00 via Android
    @yasumoto 如果中间的 9 是无限的,那么就不可能有 8 的存在,所以关键是 9 是否无限
    zsdroid
        25
    zsdroid  
       2017-11-30 12:11:43 +08:00
    @xiubin 我大 PHP 表示不服
    Tunar
        26
    Tunar  
       2017-11-30 12:12:35 +08:00 via Android
    。。突然想到这个
    1/9=0.11111111111
    2/9=0.22222222222
    3/9=0.33333333333
    。。。。。。。。。
    8/9=0.88888888888
    9/9=?
    zsdroid
        27
    zsdroid  
       2017-11-30 12:14:32 +08:00
    @yasumoto 无限小数没有最后一位,1.999999...8 是有限小数
    bxb100
        28
    bxb100  
       2017-11-30 12:37:43 +08:00 via Android
    可怕
    tlday
        29
    tlday  
       2017-11-30 12:40:41 +08:00 via Android
    @xiubin 虽然我也觉得 js 设计的很烂,但你这个论据我不服。浮点数精度又不是 js 的问题。精度敏感的场合用 decimal 是常识。
    yasumoto
        30
    yasumoto  
    OP
       2017-11-30 13:10:45 +08:00
    @Tunar 0.99999999...
    cmlx1014
        31
    cmlx1014  
       2017-11-30 13:16:24 +08:00
    高等数学学了没?
    Ehend
        32
    Ehend  
       2017-11-30 13:17:45 +08:00 via Android
    9*x/(1-x)在区间(0,1)中可以无限展开为 9*(x+x^2+x^3+x^4+...),把 x=0.1 代入可得,0.9/0.9=9*(0.1+0.01+0.001+...)=0.9999...=1
    这是高数里的级数,有兴趣可以自己学习,0.999...实质上就是 1,已经被证明了的,不是所谓的趋近于
    ybf1220
        33
    ybf1220  
       2017-11-30 13:47:30 +08:00 via iPhone   ❤️ 1
    记得以前有个比喻很形象:子弹从 0 米射向 1 米外的靶,肯定是先到 0.9 米,然后 0.99 米,然后 0.999 米 0.9999 0.99999 ……如果两个不相等不等于说子弹永远打不到 1 米的地方,所以这两个是相等的
    yvanst
        34
    yvanst  
       2017-11-30 13:56:25 +08:00 via Android
    忘记在哪看到的说法了 如果两个数之间插不进任何数 那这两个就是一个数
    xiubin
        35
    xiubin  
       2017-11-30 14:24:41 +08:00 via iPhone
    @tlday 那只是一个玩笑,不要只看前半句,看看后半句啊

    另外不开玩笑看十三楼
    UnknownR
        36
    UnknownR  
       2017-11-30 16:02:10 +08:00
    你能找到比 1 小,比 0.9 循环大的数吗
    phieo
        37
    phieo  
       2017-11-30 16:40:11 +08:00
    这不是数学问题,是 JS 精度问题
    uolcano
        38
    uolcano  
       2017-11-30 17:01:31 +08:00 via Android
    本质上是二进制到十进制小数的转换问题,所有语言都有这个问题
    keinx
        39
    keinx  
       2017-11-30 18:28:20 +08:00
    比去你那个,这个才是个奇怪的问题
    ![]( https://i.loli.net/2017/11/30/5a1fdd295a70e.png)
    zjw60320
        40
    zjw60320  
       2017-11-30 18:50:00 +08:00
    这是高中数学吧?极限的问题
    yasumoto
        41
    yasumoto  
    OP
       2017-11-30 19:39:21 +08:00
    @keinx 我发现 18000000000 秒 = 300000006 分
    ihuzhou
        42
    ihuzhou  
       2017-11-30 19:46:18 +08:00
    大学有一个教授讲座就跟我们讲 0.9 的循环==1
    tobeit
        43
    tobeit  
       2017-11-30 19:49:15 +08:00
    有个叫二进制的东西
    好好研究一下吧
    hasbug
        44
    hasbug  
       2017-12-01 09:05:03 +08:00
    千万不要对比浮点数,它会毁了你的三观。
    susucoolsama
        45
    susucoolsama  
       2017-12-01 09:28:06 +08:00
    我觉得是计算机无法表示极限吧,毕竟是 0 和 1 的集合。
    HatMatrix
        46
    HatMatrix  
       2017-12-01 13:28:19 +08:00
    不奇怪
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1291 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 38ms · UTC 17:56 · PVG 01:56 · LAX 09:56 · JFK 12:56
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.