V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
silver107
V2EX  ›  问与答

0.1 + 0.2 为什么得出来的是 一个大于 0.3 的数,而不是 一个小于 0.3 的数?

  •  
  •   silver107 · 2018-04-21 22:18:01 +08:00 · 3596 次点击
    这是一个创建于 2442 天前的主题,其中的信息可能已经有所发展或是发生改变。

    0.1 + 0.2 为什么得出来的是 一个大于 0.3 的数,而不是 一个小于 0.3 的数?

    ( 0.1 + 0.2 = 0.30000000000000004 )

    第 1 条附言  ·  2018-04-22 01:57:13 +08:00
    我估计是还明白是在哪一步舍入导致的,主要是舍入的问题
    第 2 条附言  ·  2018-04-22 11:16:31 +08:00
    rabbbit 解释得很清楚
    18 条回复    2018-04-22 03:26:39 +08:00
    AngelCriss
        1
    AngelCriss  
       2018-04-21 22:25:27 +08:00 via Android
    0.1 + 0.2 不等于 0.3 ?难道我小学数学老师原本是教体育的?
    KenroHoro
        2
    KenroHoro  
       2018-04-21 22:26:09 +08:00
    IEEE754
    wdd2007
        3
    wdd2007  
       2018-04-21 22:34:22 +08:00
    浮点数比较无意义
    jingous
        4
    jingous  
       2018-04-21 22:36:37 +08:00
    把两个小数转化为二进制加一下看看
    silver107
        5
    silver107  
    OP
       2018-04-21 22:36:55 +08:00
    @wdd2007 只是想知道精度丢失为什么反而会变大
    flowfire
        6
    flowfire  
       2018-04-21 22:37:57 +08:00 via iPhone
    。。。。四舍和五入都属于精度丢失
    lance6716
        7
    lance6716  
       2018-04-21 22:46:07 +08:00 via Android
    IEEE754
    Shura
        8
    Shura  
       2018-04-21 22:52:29 +08:00   ❤️ 1
    @silver107 因为舍入处理的时候,可以将尾数的最低位设定为 1(尾数恒置 1)。所以浮点数进行舍入处理之后反而会增大。
    bkmi
        9
    bkmi  
       2018-04-21 22:57:54 +08:00 via Android
    去搜搜计算机中浮点数的表示方法…
    q8515620
        10
    q8515620  
       2018-04-21 22:59:15 +08:00 via Android
    我是认为,精度丢失不是数值上的丢失。
    精度指的是精确度(或者说是误差?)
    jingous
        11
    jingous  
       2018-04-22 00:02:39 +08:00   ❤️ 1
    所谓的精度损失并不是每次都变小。
    精度损失体现在两个方面:一是原始的表示不精确,二是就算过程阶码较小的元素为丢位
    然后,花费半个多小时推导了过程,仅供参考:
    https://pan.baidu.com/s/1XA145TEiMo2b3GgL7HkOiQ
    jingous
        12
    jingous  
       2018-04-22 00:07:03 +08:00   ❤️ 2
    @silver107 更系统的查看 IEEE754 浮点表示,浮点加法。书可以看康继昌翻译的《计算机组成与设计》
    rabbbit
        13
    rabbbit  
       2018-04-22 02:06:30 +08:00   ❤️ 3
    有些数转换成 2 进制是无限小数,双精度浮点数最多表示 52 位,因此会丢失精度.
    rabbbit
        14
    rabbbit  
       2018-04-22 02:12:52 +08:00   ❤️ 2
    至于为啥多出来个.000004
    因为超过 52 为会自动进一舍零
    0.0001100110011001100110011001100110011001100110011001100
    变成了
    0.0001100110011001100110011001100110011001100110011001101
    要是算
    rabbbit
        15
    rabbbit  
       2018-04-22 02:14:54 +08:00   ❤️ 2
    convert('0.0100110011001100110011001100110011001100110011001100110', 2)
    结果是 0.3
    silver107
        16
    silver107  
    OP
       2018-04-22 02:49:42 +08:00
    @rabbbit 感谢,终于明白了。这种舍入方式是 IEEE 754 里的 Roundings to nearest 吗?
    msg7086
        17
    msg7086  
       2018-04-22 02:59:15 +08:00
    @silver107 二进制里不是 0 就是 1,应该没有 nearest 之分吧。
    rabbbit
        18
    rabbbit  
       2018-04-22 03:26:39 +08:00
    @silver107
    如果第 53 位是 1 就+1,如果第 53 位是 0 就不加.
    例如 0.15 的 52 位尾数是 0011001100110011001100110011001100110011001100110011
    因为第 53 位是 0,没加一
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2783 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 12:54 · PVG 20:54 · LAX 04:54 · JFK 07:54
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.