`
zhaotao_king
  • 浏览: 5818 次
  • 性别: Icon_minigender_1
  • 来自: 菏泽
社区版块
存档分类
最新评论

解决JS浮点数(小数)计算加减乘除精度问题(转)

阅读更多
/**
 ** 加法函数,用来得到精确的加法结果
 ** 说明: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;
        arg1 = 0;
    }
    try {
        r2 = arg2.toString().split(".")[1].length;
    }
    catch (e) {
        r2 = 0;
        arg2 = 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;
}

//给Number类型增加一个add方法,调用起来更加方便。
Number.prototype.add = function (arg) {
    return accAdd(arg, this);
};

 

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

// 给Number类型增加一个mul方法,调用起来更加方便。
Number.prototype.sub = function (arg) {
    return accMul(arg, this);
};

 

/**
 ** 乘法函数,用来得到精确的乘法结果
 ** 说明: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方法,调用起来更加方便。
Number.prototype.div = function (arg) {
    return accDiv(this, arg);
};

 

转至:http://www.cnblogs.com/binjoo/archive/2012/09/10/2679151.html

分享到:
评论

相关推荐

    解决JS浮点数(小数)计算加减乘除的BUG

    解决JS浮点数(小数)计算加减乘除的BUG

    javascript解决小数的加减乘除精度丢失的方案

    在JavaScript开发中,处理小数加减乘除运算时经常会遇到精度丢失的问题。由于JavaScript中的数字是以IEEE 754标准的双精度64位浮点数来表示的,这就意味着它可以精确地表示的整数范围大约在-***到***之间。当超出这...

    javascript解决小数的加减乘除精度丢失的方案.docx

    ### JavaScript 解决小数加减乘除精度丢失的方案 #### 一、引言 在JavaScript中处理小数运算时,经常会遇到一个令人头疼的问题——精度丢失。这主要是因为JavaScript中的数字采用IEEE 754标准下的双精度64位浮点数...

    js加减乘除丢失精度问题解决方法

    在javascript中,当你使用小数进行加减乘除运算时,你会发现,所得到的结果有时后面带有长长的一段小数,使运算变得复杂,并且影响计算结果。上网查询了一下原因,大致如下:在javascript中,带小数的数据运算时总会...

    Javascript 浮点数精确计算

    但是,这种方法在进行加减乘除等操作时需要额外的转换逻辑,性能上可能不如直接使用浮点数。 3. **使用特定库**:有一些JavaScript库,如`decimal.js`或`big.js`,专门用于处理高精度浮点数计算。这些库内部使用大...

    js 加减乘除

    为了解决这个问题,我们需要设计一套方法来确保加减乘除等基本运算的准确性。 #### 一、问题现象与原因分析 1. **现象**:在JavaScript中执行如`0.1 + 0.2`这样的简单运算时,结果不是预期的`0.3`,而是`0....

    JS浮点数字操作插件floatOPS.js

    在JavaScript编程中,...总结起来,floatOPS.js是一个专注于解决JavaScript中浮点数运算精度问题的插件,通过提供加减乘除四个方法,确保了在进行浮点数运算时的精度,对于需要精确计算的场景具有很高的实用价值。

    计算器--简单的加减乘除

    本文将详述“计算器--简单的加减乘除”这一主题,着重解析如何解决数据精度问题,以及在加减乘除操作中保持计算精确性的方法。 首先,我们需要理解计算机在处理数字时可能面临的精度问题。在大多数编程语言中,如...

    详解js加减乘除精确计算

    JavaScript中的加减乘除运算在处理浮点数时可能会出现精度丢失的问题,这是由于计算机内部存储和计算浮点数的方式导致的。浮点数在计算机内存中是以二进制表示的,某些十进制小数转换成二进制时无法精确表示,从而...

    javascript加减乘除的简洁实例_.docx

    在JavaScript中,进行基本的数学运算如加、减、乘、除是相当直观的,但当我们处理浮点数时,可能会遇到精度问题。这个文档提供了一些简洁的实例,通过自定义函数来解决浮点数计算时可能出现的精度丢失问题。 首先,...

    js浮点数处理转精确值

    这样可以确保在进行加减乘除运算时保持精度。例如,将0.1和0.2分别转换为1和2,然后进行加法,得到3,再除以10得到0.3,这样就避免了浮点数运算的不精确性。 另一种方法是使用JavaScript的`Number.toFixed()`方法,...

    js 对小数加法精度处理示例说明

    总结来说,`accAdd`函数通过调整数值的大小,使其能够以整数形式进行加法运算,从而避免了JavaScript浮点数加法的精度问题。在需要进行高精度小数运算的场景下,这样的方法是十分有用的。在实际开发中,还可以考虑...

    javascript加减乘除的简单实例.docx

    总结来说,这个实例提供了一套处理JavaScript中浮点数运算精度问题的解决方案,确保在进行加、减、乘、除运算时能得到精确的结果,尤其在涉及小数的场景下。通过自定义函数和扩展字符串类型,可以更方便地在代码中...

    javascrpt的加减乘除运算

    ### JavaScript中的精确加减乘除运算 在JavaScript中进行数学计算时,经常会出现精度丢失的问题,尤其是在处理小数运算时尤为明显。这是因为JavaScript中的数字是以双精度浮点数(64位)形式存储的,遵循IEEE 754...

    javascript小数精度丢失的完美解决方法

    先确定涉及数值的小数位数,然后根据最大或最小的小数位数来对数值进行放大或缩小,以保证在进行加减乘除运算时,所有的计算都是基于整数进行的,避免了直接对小数进行运算而产生的精度误差。 文章最后提到,由于...

    js小数运算出现多位小数如何解决

    在使用JavaScript进行小数运算时,特别是加、减、乘、除四种基本运算,经常会遇到结果出现过多的小数位数问题。具体来说,当两个小数进行运算时,结果往往不是精确值,而是由于浮点数精度问题或者二进制转换所导致的...

    js代码-200601-不用加减乘除做加法

    标题和描述所提到的"js代码-200601-不用加减乘除做加法"就是这样一个例子,它探讨了如何在JS中实现加法运算而不直接使用加法运算符。 在JavaScript中,加法运算符"+"除了用于数字的加法之外,还有一个特殊功能,即...

    javascript加减乘除的简单实例

    总结一下,JavaScript中的加减乘除运算可能由于浮点数的表示方式而存在精度问题。为了克服这个问题,可以编写自定义函数,如`accDiv`、`accMul`、`accAdd`和`accSubtr`,它们通过计算小数位数并使用`Math.pow()`来...

Global site tag (gtag.js) - Google Analytics