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

为啥老黑 js 的 0.1+0.2 不等于 0.3?

  •  
  •   fulvaz · 2018-07-06 23:52:00 +08:00 · 4568 次点击
    这是一个创建于 2340 天前的主题,其中的信息可能已经有所发展或是发生改变。

    先上代码

    class main {
    	public static void main(String[] args) {
    		double a = 0.1;
    		double b = 0.2;
    		System.out.println(0.1+0.2);
    	}
    }
    
    

    今晚参加个面基活动, 有人提出可以利用 js 做浏览器端科学运算, 然后又又又有人立刻反驳 0.1+0.2 这个问题, 连前端自己都黑.

    嗯....IEEE754 了解一下? 将来报道出现了偏差你们是要负责的.


    ps: 今晚的面基活动挺有意思的, 大部分内容是心脏按摩, 要扛得住压力, node.js 一把梭就是干, 不要怂.

    18 条回复    2018-07-10 11:16:50 +08:00
    joouis
        1
    joouis  
       2018-07-06 23:55:36 +08:00 via Android
    没觉得有人黑呀,py 也是,如楼主所说就是 IEEE754 规定的~
    ToT
        2
    ToT  
       2018-07-06 23:57:28 +08:00
    是 double 型 精度问题么?

    '''
    >>> 0.1+0.2
    Out[2]: 0.30000000000000004
    '''
    jiang42
        3
    jiang42  
       2018-07-06 23:58:28 +08:00 via iPhone
    一般黑的是一加一不等于二吧……
    fulvaz
        4
    fulvaz  
    OP
       2018-07-07 00:03:04 +08:00
    fulvaz
        5
    fulvaz  
    OP
       2018-07-07 00:03:21 +08:00
    @ToT 对.
    fulvaz
        6
    fulvaz  
    OP
       2018-07-07 00:08:05 +08:00   ❤️ 1
    一般黑的应该是 js 那套令人糟心的转换规则

    除了===, 其他比较运算符会自动进行类型转换, 甚至对对象也进行转换

    +, -也会进行类型转换

    emac262 有详细说明----然后你会发现红宝书(js 高级编程)讲漏了, 或者是书上的表述不准确, 但是这并不能说红宝书不好, 至少你能直接啃 emac262 之前, 红宝书带你入门了

    但是一般人也不会写出这种东西来, 因为上一个死活要让数字和数组比出大小的人已经被开除了.
    rabbbit
        7
    rabbbit  
       2018-07-07 00:10:18 +08:00
    烦人的是面试总考这些东西,有时侯不注意会踩坑

    刚遇到的
    当一个对象被传递给 fill 方法的时候, 填充数组的是这个对象的引用.
    > a = new Array(9).fill([])
    [ [], [], [], [], [], [], [], [], [] ]
    > a[0][0] = 1
    1
    > a
    [ [ 1 ], [ 1 ], [ 1 ], [ 1 ], [ 1 ], [ 1 ], [ 1 ], [ 1 ], [ 1 ] ]
    ca1123
        8
    ca1123  
       2018-07-07 00:19:08 +08:00   ❤️ 1
    浮点运算是对 “自然数域” 的模拟,甚至不能这么简单说。从抽象功能到具体实现,逐步放弃一些东西,基本是:
    自然数运算 -> 有理数运算 -> 有限位数的小数运算 -> 浮点运算 -> 布尔代数运算 -> ALU 硬件
    Mathematica 之类这种大型软件解决了自然数里面,抽象定义无理数的问题。(当然也包括其它数学结构)
    有理数运算是可以用高级语言实现的,就像 R 之类的东西提供的功能。
    有限位数小数运算,计算器做的就比较好。他会四舍五入。
    浮点运算是为了迁就 ALU 做出来的,效率比较高,你可以假装定义上的缺陷是误差来编程,也没什么大碍。
    ALU 就是基本的电路逻辑了。
    ca1123
        9
    ca1123  
       2018-07-07 00:20:52 +08:00
    或者基本上有限位数的小数运算等同于整数运算,再加上控制上下溢出和点小数点。
    startar
        10
    startar  
       2018-07-07 00:51:02 +08:00 via Android
    没有整数类型 在某些场景下是个坑。尤其是用到 int64 的时候
    Raymon111111
        11
    Raymon111111  
       2018-07-07 01:52:38 +08:00
    为啥可以无脑的
    [] + {} ?
    {} + [] ?

    允许这种行为的语言???
    janxin
        12
    janxin  
       2018-07-07 09:14:12 +08:00 via iPad
    你根本不了解 js 力量系列
    lamCJ
        13
    lamCJ  
       2018-07-07 09:44:45 +08:00 via iPhone
    老板催进度 竞争对手又是巨硬 程序员在亚历山大的情况下 10 天搞出来的东西 可能本身就没考虑那么多吧(误+笑

    另外谁能在互联网刚开始( 1994+1 )的时候 就能预料到因为 0.1+0.2 !== 0.3 会给现代程序员带来的“忧伤”呢?毕竟从数制转换原理的层面上 这种现象只是没有伪装 直接表现出来而已 也不光 js 一个
    fulvaz
        14
    fulvaz  
    OP
       2018-07-07 10:24:51 +08:00
    @Raymon111111 因为很简单....前端永远不知道后端会传来什么奇奇怪怪的值, 也不知道用户会传来什么奇怪的值, 有些值就算错了也没关系, 可能 ui 上也看不到, 这样宽容的设计在前端没问题啊, ui 总不能随便崩对吧?
    azh7138m
        15
    azh7138m  
       2018-07-07 10:54:49 +08:00 via Android   ❤️ 1
    @lamCJ 不会带来忧伤,浮点数就是这个样子的,换个语言也这样,或者说是,为这种特性能 js 的,应该是没有系统的学过 cs
    ca1123
        16
    ca1123  
       2018-07-07 12:16:42 +08:00
    靠,我说的自然数其实是实数的意思。。。
    fulvaz
        17
    fulvaz  
    OP
       2018-07-07 13:39:18 +08:00
    @ca1123 ....老铁, 我觉得我要去把书捡回来, 我记得貌似真和加法器啥的有关, 不过太久远了...全忘了
    suduo1987
        18
    suduo1987  
       2018-07-10 11:16:50 +08:00
    http://0.30000000000000004.com/
    了解一下,不光是 JS
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1005 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 18:54 · PVG 02:54 · LAX 10:54 · JFK 13:54
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.