`

js中浮点型运算

 
阅读更多
http://www.cnblogs.com/wangkongming/archive/2013/01/18/2866788.html

(function ($) {
    $.MathUtils = {
        //加法函数,用来得到精确的加法结果
        //说明:javascript的加法结果会有误差,在两个浮点数相加的时候会比较明显。这个函数返回较为精确的加法结果。
        //调用:accAdd(arg1,arg2)
        //返回值:arg1加上arg2的精确结果
        add: function (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
        },
        //减法函数,用来得到精确的加法结果
        //说明:javascript的加法结果会有误差,在两个浮点数相加的时候会比较明显。这个函数返回较为精确的加法结果。
        //调用:accAdd(arg1,arg2)
        //返回值:arg1加上arg2的精确结果
        sub: function (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的精确结果
        mul: function (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的精确结果
        div: function (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类型增加一个add方法,调用起来更加方便。
    Number.prototype.add = function (arg){
        return $.MathUtils.add(arg, this);
    }

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

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

    //给Number类型增加一个mul方法,调用起来更加方便。
    Number.prototype.mul = function (arg){
        return $.MathUtils.mul(arg, this);
    }
    /*var a=0.69;
    var b=10;
    alert(a*b);//6.8999999999999995
    alert($.MathUtils.mul(a, b));*/
})(jQuery);
分享到:
评论

相关推荐

    js中浮点型运算BUG的解决方法说明.docx

    在JavaScript编程语言中,浮点型数值的运算可能会遇到一些精度问题,这主要是由于二进制表示浮点数的方式导致的。本文将详细介绍如何解决JavaScript中的浮点型运算BUG,并提供一些实用的函数来实现更精确的计算。 ...

    js中浮点型运算BUG的解决方法说明

    JavaScript中的浮点型运算在处理小数时可能会出现精度问题,这是由于计算机内部表示浮点数的方式导致的。在JS中,浮点数运算不是完全精确的,这在进行涉及小数的加、减、乘、除操作时尤为明显。为了解决这个问题,...

    js中浮点类型数据的计算

     我Google了一下,发现原来这是JavaScript浮点运算的一个bug。  比如:7*0.8 JavaScript算出来就是:5.6000000000000005  网上找到了一些解决办法,就是重新写了一些浮点运算的函数。  下面就把这些方法摘录...

    浅析js中的浮点型运算问题

    在JavaScript中,浮点型运算涉及到的是数字表示和计算精度的问题。由于计算机内部是以二进制形式存储和处理数据的,而十进制的小数在转换为二进制时可能会出现无限循环,导致无法精确表示某些浮点数,这就会引发浮点...

    js中Number数字数值运算后值不对的解决方法.docx

    JavaScript 中 Number 数字数值运算后值不对的解决方法 ...解决 JavaScript 中 Number 数字数值运算后值不对的问题需要重新编写浮点运算函数或使用 Number 的 prototype 方法来实现精确的浮点运算。

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

    而floatOPS.js的add方法能够确保在加法运算中不丢失精度。 减法方法(sub):减法操作同样面临精度问题,如1.5 - 1.4999999999999996可能不等于0.000000000000001。floatOPS.js的sub方法可以解决这个问题,提供一个...

    JS中乘法的浮点错误解决方法

    创建一个自定义函数,如上面示例中的`rate`函数,用来计算小数部分的长度,然后在乘法运算中使用这个函数来调整精度。这个方法虽然较为复杂,但可以灵活地应用于各种浮点数运算。 3. **四舍五入法**: 使用...

    js处理浮点算法

    由于JavaScript使用的是IEEE 754标准的双精度64位浮点格式来存储所有的数字类型,因此在进行加、减、乘、除等运算时,可能会出现结果不精确的情况。 #### 原理分析 首先理解为什么会出现这样的问题: 1. **存储误差...

    Javascript 浮点运算的问题分析与解决方法

    这种不精确性导致了浮点运算中的精度丢失,使得看似简单的运算如1.1在JavaScript中不能精确地表示为`1.1`。 在JavaScript中,浮点运算的问题有时会表现为比较错误,如`1.0 - 0.9 !== 0.1`。这是因为计算过程中产生...

    解析四则运算

    5. **异常处理**:在除法运算中,如果除数为零,大部分编程语言会抛出一个异常。因此,编写代码时需要检查除数是否为零以避免运行时错误。 6. **编译器优化**:现代编译器和解释器会对四则运算进行优化,例如,常量...

    Javascript 浮点运算精度问题分析与解决

    #### 知识点三:浮点数运算中的精度问题 由于上述存储限制,浮点数的运算结果往往不是完全准确的。在JavaScript中,当进行1.0 - 0.9这样的运算时,因为各自的小数部分都已近似存储,计算结果同样是一个近似值,于是...

    double.js:javascript中的double-double运算。 具有31个精确十进制数字的浮点扩展

    与这种方法相比,这带来了准确性,并显着提高了性能,因为该浮点运算是在硬件中实现的。 请注意,由于ECMAScript使用64位IEEE 754,且每次操作后均舍入至最接近且无FMA指令,因此对JavaScript语言没有理论上的限制...

    JavaScript实现大数的运算

    对于非常大或非常小的数,可以用科学记数法表示浮点值。采用科学记数法,可以把一个数表示为数字加e/E,后面加乘以10的倍数,如: 代码如下: var num1 = 3.125e7; // 31250000 var num2 = 3e-17; // 0....

    JS 能表示的最大数值及JS Number类型数字位数及IEEE754标准1

    总之,JavaScript中的Number类型遵循IEEE 754标准,存在浮点数精度问题,尤其是涉及到大整数和小数运算时。了解这些限制对于编写高精度的代码至关重要,特别是在金融计算和其他需要精确数值操作的场景中。在必要时,...

    javascript中的float运算精度实例分析

    在JavaScript编程中,浮点数的运算精度是一个需要特别注意的问题。在处理金融数据、科学计算或任何需要精确数值的场景下,精度问题尤为突出。...通过上述方法,开发者可以有效地处理和校正浮点运算中可能出现的误差。

    js中Number数字数值运算后值不对的解决方法

    我Google了一下,发现原来这是JavaScript浮点运算的一个bug。 比如:7*0.8 JavaScript算出来就是:5.6000000000000005 解决方法:网上找到了一些解决办法,就是重新写了一些浮点运算的函数。 下面就把这些方法摘录...

    Javascript浮点数乘积运算出现多位小数的解决方法

    比如在Javascript中,1038.1这个十进制数转换为二进制后是一个无限循环小数,而在计算机内部只能存储一个近似值。 针对这个问题,不同的编程语言都有自己的解决方案。在Javascript中,可以使用toFixed()方法来处理...

Global site tag (gtag.js) - Google Analytics