javascript 浮点数加减乘除计算会有问题, 整理了以下代码来规避这个问题

news/2024/7/5 6:51:35 标签: javascript
javascript">/*
 * js数学计算  add by yan
 */


/**
 ** 加法函数,用来得到精确的加法结果
 ** 说明:javascript的加法结果会有误差,在两个浮点数相加的时候会比较明显。这个函数返回较为精确的加法结果。
 ** 调用:accAdd(arg1,arg2)
 ** 返回值:arg1加上arg2的精确结果
 **/
function accAdd(arg1, arg2) {
    var r1, r2, m, c;
    try {
        r1 = arg1.toString().split(".")[1].length;
    }
    catch (e) {
        r1 = 0;
    }
    try {
        r2 = arg2.toString().split(".")[1].length;
    }
    catch (e) {
        r2 = 0;
    }
    c = Math.abs(r1 - r2);
    m = Math.pow(10, Math.max(r1, r2));
    if (c > 0) {
        var cm = Math.pow(10, c);
        if (r1 > r2) {
            arg1 = Number(arg1.toString().replace(".", ""));
            arg2 = Number(arg2.toString().replace(".", "")) * cm;
        } else {
            arg1 = Number(arg1.toString().replace(".", "")) * cm;
            arg2 = Number(arg2.toString().replace(".", ""));
        }
    } else {
        arg1 = Number(arg1.toString().replace(".", ""));
        arg2 = Number(arg2.toString().replace(".", ""));
    }
    return (arg1 + arg2) / m;
}

/**
 ** 减法函数,用来得到精确的减法结果
 ** 说明:javascript的减法结果会有误差,在两个浮点数相减的时候会比较明显。这个函数返回较为精确的减法结果。
 ** 调用:accSub(arg1,arg2)
 ** 返回值:arg1加上arg2的精确结果
 **/
function accSub(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);
}

/** 
 ** 除法函数,用来得到精确的除法结果
 ** 说明: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);
    }
}

/** 
 ** 保留2位小数
 ** 说明:保留2位小数,如:2,会在2后面补上00.即2.00  
 ** 调用:toDecimal2(arg1)
 ** 返回值:保留2位小数
 **/
function toDecimal2(x) {
    var f = parseFloat(x);
    if (isNaN(f)) {
        return false;
    }
    var f = Math.round(x * 100) / 100;
    var s = f.toString();
    var rs = s.indexOf('.');
    if (rs < 0) {
        rs = s.length;
        s += '.';
    }
    while (s.length <= rs + 2) {
        s += '0';
    }
    return s;
} 

  


http://www.niftyadmin.cn/n/1132315.html

相关文章

为什么你的数据分析报告,总被领导打回?

咱们先来设想一个场景&#xff0c;一个会议室里坐满了人&#xff0c;正在做报告的年轻人西装笔挺&#xff0c;头发书的一丝不苟&#xff0c;PPT上列满了数据和图表&#xff0c;他正在论证一个什么东西。年轻人讲了很多&#xff0c;可是在台下听报告的一个穿着随意的大佬&#x…

讲给普通人听的分布式数据存储(转载)

转载&#xff1a;http://www.linuxeden.com/html/news/20150925/162996.html 虽然说是讲给普通人的&#xff0c;恐怕没有数据理论知识也是看不懂的&#xff0c;不过已经将的很明白了&#xff0c;个人觉得将的很不错的一点&#xff1a; 联系到我们之前的主&#xff0f;副例子&am…

window.Event参数详解

原文地址&#xff1a;window.Event参数详解作者&#xff1a;cz0090704window.evet 说明 event代表事件的状态&#xff0c;例如触发event对象的元素、鼠标的位置及状态、按下的键等等。 event对象只在事件发生的过程中才有效。 event的某些属性只对特定的事件有意义。比如&#…

2019年中国大数据BI(商业智能)行业预测报告

商业智能&#xff08;Business Intelligent&#xff09;也被称为商业智慧或商务智能&#xff0c;人们习惯的称呼为“BI“&#xff0c;围绕BI工具建设的平台常称为”某某BI系统“、”某某报表平台“、”某某管理驾驶舱“等。BI&#xff08;商业智能&#xff09;技术提供使企业迅…

C#将string转换为十六进制

/// <summary>/// 将string格公式为十六进制数据/// </summary>/// <param name"msg">/// </param>/// <returns>/// </returns>public static string tenToSixteen(string msg){long number Convert.ToInt64(msg);return Conv…

为11.2.0.2 Grid Infrastructure添加节点

转自:http://www.askmaclean.com/archives/add-node-to-11-2-0-2-grid-infrastructure.html 在之前的文章中我介绍了为10g RAC Cluster添加节点的具体步骤。在11gr2中Oracle CRS升级为Grid Infrastructure&#xff0c;通过GI我们可以更方便地控制CRS资源如:VIP、ASM等等&#x…

数据治理成功的六大要素,你做到了几个?

文|帆软数据应用研究院 汪建辉 引言&#xff1a; 帆软作为全球数据分析和商业智能平台提供商&#xff0c;这几年深刻的感受到了全球数据应用的热潮&#xff0c;但是随着越来越多的客户开始实施并广泛应用BI系统&#xff0c;数据治理的话题也在最近被越来越多地提及和讨论。 …

教程分享:如何实现Android沉浸式状态栏——教你让你的状态栏变个色!

2019独角兽企业重金招聘Python工程师标准>>> 一、概述 近期注意到QQ新版使用了沉浸式状态栏&#xff0c;ok&#xff0c;先声明一下&#xff1a;本篇博客效果下图&#xff1a; 关于这个状态栏变色到底叫「Immersive Mode」/「Translucent Bars」有兴趣可以去了解下…