码农可能觉得是一个小事,却颠覆了我的认知

  • 电冰箱
    看D版sunmingqiu写的《Pythone管窥》一书,有这么一段:
    小数也称作浮点数,小圆点好像可以浮动一样。实际上在各种编程语言里,小数实际上是不精确的。比如:0.1+0.1+0.1-0.3=5.551115123125783e-17
    为什么会这样?!这个其实是计算机硬件的一个内在缺陷,导致了浮点数运算的精度出现了问题。





    我一直以为计算机别的不说,在计算方面是绝对正确的,没想几千块买的cpu,这种小学数学题都算不来 。
  • 令狐飞云
    浮点运算是因为进制转换吧
  • y
    yipsilon
    是的,经常float或double类型直接乘除运算出来的就是 x.000000000000001 或者 y.999999999999。
  • z
    zqj1024
    我还打印出来了,但好像学不会
  • c
    cxzx150133
    这不是硬件缺陷,这是基于二进制设计的计算机进行十进制运算的必然。
    二进制不能准确的表示所有十进制数。
  • G
    Greazen
    因为二进制能精确表示的小数只有0. 5的n次方的组合
  • L
    LittlePan
    没错,所以比较浮点值的时候不可以直接比较,要比较两个数的差。
  • R
    Romney
    所以需要BigDecimal
  • j
    jeadong
    你要是知道某年Intel芯片层面就算错是不是直接奔溃了客户安卓猴自己端
  • 斩断意识流
    想精确计算,用mathematica
  • s
    sz-hiker
    看不懂
  • j
    jiang_gg
    刚想说这个… iOS fly ~
  • l
    lance6716
    也不叫缺陷。把(范围、精度、……)无限的数字用有限的硬件表示本来就不可能,只能用近似表达
  • b
    beck917
    所以在一些金融系统内,都会有类似的算法

    https://blog.csdn.net/qq_34745295/article/details/96905782
  • a
    ageg
    这句话理解不对。计算机是绝对正确的,只是进制转换不精确而已。如果人类也用二进制,那么就不会有误差。
  • w
    weiyangge
    首先,你得知道浮点数在计算机内部是怎么表示的。
  • j
    jckimi
    回复2#令狐飞云


    归根到底,应该是计算机语言,只有0和1
  • s
    se_happy
    这不是硬件缺陷
    这是浮点数精度问题 iOS fly ~
  • R
    RobbieXP
    二进制,有限位数,计算效率,小数的表示形式
  • t
    timeinwait
    想一想二进制
  • y
    yhny
    深入理解计算机系统

    看完这本书就知道了
  • 猫了个咪的
    编码在计算机中是比较麻烦的问题
  • h
    honkin
    这就是理论和实际的差距吧,就像任何测量出来的尺寸都是测量值,只能越来越接近真实值 iOS fly ~
  • z
    zhdphao
    这都不是事儿。在要求更高精确度的场合,可以专门编程,比如说,用10000000个bit表示一个小数。
  • n
    navyyang
    浮点运算就是这样的。
  • 寒冰炫
    我java对double型处理的时候,特别是除法,经常会遇到结果是1.129999999999999之类的后面一大堆数字出现

    这个一不注意就中招了,我的解决方法是四舍五入到小数点后两位...
  • B
    BuleGood
    进制转换导致的精度缺失小尾巴~
  • w
    welcomyou
    我们的表示分钟的是60进制 你把59分钟转换成十进制一样有误差 为了避免误差 我们就不转换 因为我们的脑子还能算的过来 同理 如果我们能看待二进制和看待60进制一样容易 你也可以不转换 直接读二进制 现在的问题是你没用能力对二进制进行自如的解读 那计算机帮你转 误差就自己担待吧 iOS fly ~
  • t
    tsounny
    几百万买的跑车,居然没有手扶拖拉机拉的东西多
  • 轧钢机
    还记得当年的千年虫 bug吗 就是电脑只能用到1999年... 哈哈
  • l
    lanwater
    看起来你从来不用excel计算大量数据 iOS fly ~
  • e
    ehgui
    楼主你去学学小数的进制转换就知道了
  • z
    zengshu
    0.1+0.1+0.1-0.3
    如果只是这种,可以用整数计算模拟(定点计算),用不着浮点。
  • 大部头书
    你觉得宇宙中的普朗克常量是怎么回事
  • h
    harriet_yang
    这不算缺陷吧,这是人力不能做到的地方。 就好像你不能写出来一个无限小数, 有限的硬件当然也做不到。
  • x
    xyching
    回复31#轧钢机

    是系统,不是电脑
  • R
    Ricepig
    这个是计算机系统里定义的浮点数及计算方法的问题。ieee 754。
  • k
    kurt_yan
    别说码农觉得是小事了。我见过很多大厂的程序员缺乏这一常识,以至于在与金额相关的系统里用float保存金额。

    比如这个美团外卖早期的bug,真是令人笑掉大牙。


    iOS fly ~