silver107
V2EX  ›  问与答

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

  •  
  •   silver107 · Apr 21, 2018 · 4643 views
    This topic created in 3122 days ago, the information mentioned may be changed or developed.

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

    ( 0.1 + 0.2 = 0.30000000000000004 )

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