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

一个有关误差的问题

  •  
  •   scriptish · 2016-12-27 13:30:13 +08:00 · 1993 次点击
    这是一个创建于 2892 天前的主题,其中的信息可能已经有所发展或是发生改变。
    初学者
    java 环境下
    double pi =3.14;
    int a = 10;
    int b = 2;
    double z = pi*a*b;
    System.out.println(z);

    我预期的结果是 62.8
    但 myeclipse 的结果是: 62.800000000000004

    我的问题是:最后的 4 为什么会出现
    如果我想深入了解这个误差为什么会出现,可以去看哪些教材

    谢谢了
    9 条回复    2016-12-28 16:15:44 +08:00
    misaka19000
        1
    misaka19000  
       2016-12-27 13:53:32 +08:00 via Android
    IEEE 754
    ivvei
        2
    ivvei  
       2016-12-27 14:14:12 +08:00
    你自己琢磨下怎样用二进制来表示一个浮点数的问题应该就有思路了。
    tianshuang
        3
    tianshuang  
       2016-12-27 14:27:56 +08:00
    深入理解计算机系统
    SoloCompany
        4
    SoloCompany  
       2016-12-27 21:57:38 +08:00
    需要 10 进制浮点运算的请使用 BigDecimal
    owt5008137
        5
    owt5008137  
       2016-12-28 09:04:53 +08:00 via Android
    epsilon
    allenhu
        6
    allenhu  
       2016-12-28 10:32:28 +08:00
    0.999999........... = 1
    weizhiyao008
        7
    weizhiyao008  
       2016-12-28 13:56:19 +08:00
    IEEE 浮点
    或者买本《深入理解计算机系统》,翻了一下目录,大概 67 页开始
    TerrenceSun
        8
    TerrenceSun  
       2016-12-28 15:24:12 +08:00
    准确一点,这个问题是二进制浮点的精度问题。
    大部分的小数,是没办法用二进制进行精确表示的。
    srlp
        9
    srlp  
       2016-12-28 16:15:44 +08:00 via iPhone
    1 楼和 8 楼结合来看,答案很全面了。

    重点在于,初学阶段,你只需要记住 double 是无法准确判定 == 的就好了。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1587 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 16:53 · PVG 00:53 · LAX 08:53 · JFK 11:53
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.