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

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

  •  
  •   yasumoto · 2017-11-30 10:14:11 +08:00 · 4193 次点击
    这是一个创建于 686 天前的主题,其中的信息可能已经有所发展或是发生改变。
    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
        1
    em84   2017-11-30 10:15:42 +08:00
    o.999999...不就是等于 1
        2
    FreeEx   2017-11-30 10:21:51 +08:00
    试试这个 console.log(1/3 + 1/3 +1/3);
        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
        4
    Tink   2017-11-30 10:24:26 +08:00
    有个东西叫微积分
        5
    changnet   2017-11-30 10:24:57 +08:00 via Android
    浮点型精度问题,哪种语言都有啊
        6
    hsuan   2017-11-30 10:25:00 +08:00
    楼主高中生吧,没学过极限的概念?
        7
    zhx1991   2017-11-30 10:25:17 +08:00
    1=0.9 的循环

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

    计算机没有无限循环的说法
        8
    mengzhuo   2017-11-30 10:26:10 +08:00
    @xiubin #3 好好学计算机基础,整数和浮点是有区别的。跟什么语言没有关系。
        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 浮点数的值不精确导致===结果很奇怪
        10
    Navee   2017-11-30 10:34:07 +08:00
    你要考虑到计算机语言浮点类型数据的精度。
        11
    zhengxiaowai   2017-11-30 10:39:42 +08:00
    听过 ieee 754 么,绝大多数的语言的浮点数都是用这个标准的
        12
    xiubin   2017-11-30 10:47:46 +08:00
    @mengzhuo #8 请先生为我解惑
        13
    mengzhuo   2017-11-30 11:00:47 +08:00   ♥ 1
    @xiubin #12

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

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

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