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

浮点数运算的问题

  •  
  •   virusdefender · 2015-01-25 10:54:55 +08:00 · 1889 次点击
    这是一个创建于 3591 天前的主题,其中的信息可能已经有所发展或是发生改变。

    最近在进行浮点数运算的时候经常遇见精度问题,基本原理我也知道了,就是一些小数使用二进制表示的时候是无穷多位的,一个浮点数的64位没办法全部表示,导致出现误差。这样的话,二进制的加法和减法出现误差也是同理。比如0.7 + 0.1 0.7 - 0.43等。

    在乘法和除法运算的时候也会出现这个问题,但是我对二进制的乘法和除法不了解,网上的资料也看不大懂。为什么81.6 * 10 81.6 * 100结果也不一样。大家可以在浏览器 console 里面试一下。

    因为最近看到一段 js 代码是这样处理问题的,

    function accAdd(arg1, arg2) {
        var r1, r2, m;
        try {
            r1 = arg1.toString().split(".")[1].length
        } catch (e) {
            r1 = 0
        }
        try {
            r2 = arg2.toString().split(".")[1].length
        } catch (e) {
            r2 = 0
        }
        m = Math.pow(10, Math.max(r1, r2));
        return (arg1 * m + arg2 * m) / m;
    }
    

    一个小数点后面 n 位的小数乘以10的 n 次方是否一定是一个能准确表达的数值呢?为什么乘以比10的 n 次方还大的数字(比如100)却有问题呢?

    2 条回复    2015-01-25 12:39:33 +08:00
    ooxxcc
        1
    ooxxcc  
       2015-01-25 12:23:52 +08:00
    对付点数别判断相等,判断差小于一个阈值就可以了

    你的理解有微妙的误差。。建议看一下计算机原理关于浮点数储存和格式的那一部分
    ryd994
        2
    ryd994  
       2015-01-25 12:39:33 +08:00 via Android
    参考工程运算里关于有效数字的概念
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2782 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 07:37 · PVG 15:37 · LAX 23:37 · JFK 02:37
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.