• js计算精度问题,函数整理


    //问题比如:7*0.8 JavaScript算出来就是:5.6000000000000005
    
    //加法函数,用来得到精确的加法结果
    //说明:javascript的加法结果会有误差,在两个浮点数相加的时候会比较明显。这个函数返回较为精确的加法结果。
    //调用:accAdd(arg1,arg2)
    //返回值:arg1加上arg2的精确结果
    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
    }
    //用法:
    //给Number类型增加一个add方法,调用起来更加方便。
    Number.prototype.add = function (arg) {
    return accAdd(arg, this);
    }
    //如:
    var t1 = 6.60;
    var t2 = 1.32;
    var t3 = 1.2;
    var t4 = 1.2;
    var t5 = 1.2;
    alert(Number(t1).add(Number(t2)).add(Number(t3)).add(Number(t4)).add(Number(t5)));
    
    //减法函数,用来得到精确的减法结果
    function Subtr(arg1, arg2) {
    var r1, r2, m, n;
    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));
    //last modify by deeka
    //动态控制精度长度
    n = (r1 >= r2) ? r1 : r2;
    return ((arg1 * m - arg2 * m) / m).toFixed(n);
    }
    
    //乘法函数,用来得到精确的乘法结果
    //说明:javascript的乘法结果会有误差,在两个浮点数相乘的时候会比较明显。这个函数返回较为精确的乘法结果。
    //调用:accMul(arg1,arg2)
    //返回值:arg1乘以arg2的精确结果
    function accMul(arg1, arg2) {
    var m = 0, s1 = arg1.toString(), s2 = arg2.toString();
    try { m += s1.split(".")[1].length } catch (e) { }
    try { m += s2.split(".")[1].length } catch (e) { }
    return Number(s1.replace(".", "")) * Number(s2.replace(".", "")) / Math.pow(10, m)
    }
    //用法:
    //给Number类型增加一个mul方法,调用起来更加方便。
    Number.prototype.mul = function (arg) {
    return accMul(arg, this);
    }
    
    //除法函数,用来得到精确的除法结果
    //说明:javascript的除法结果会有误差,在两个浮点数相除的时候会比较明显。这个函数返回较为精确的除法结果。
    //调用:accDiv(arg1,arg2)
    //返回值:arg1除以arg2的精确结果
    function accDiv(arg1, arg2) {
    var t1 = 0, t2 = 0, r1, r2;
    try { t1 = arg1.toString().split(".")[1].length } catch (e) { }
    try { t2 = arg2.toString().split(".")[1].length } catch (e) { }
    with (Math) {
    r1 = Number(arg1.toString().replace(".", ""))
    r2 = Number(arg2.toString().replace(".", ""))
    return (r1 / r2) * pow(10, t2 - t1);
    }
    }
    //用法:
    //给Number类型增加一个div方法,调用起来更加方便。
    
    详细出处参考:http://www.jb51.net/article/35892.htm
    庆幸的是我,一直没回头。
  • 相关阅读:
    luogu P5488 差分与前缀和 FFT
    luogu P4173 残缺的字符串 FFT
    《数据结构与算法分析(C++语言描述)》
    《C语言—从入门到项目实践》Issue分析及总结
    操作系统学习笔记——第六章 文件管理
    操作系统学习笔记——第五章 I/O设备管理
    操作系统学习笔记——第四章 存储管理
    操作系统学习笔记——第二章 进程管理 和 第三章 死锁
    操作系统学习笔记——第一章 操作系统概述
    操作系统学习笔记——全部知识点流程图
  • 原文地址:https://www.cnblogs.com/rocblog/p/3093224.html
Copyright © 2020-2023  润新知