js計算誤差修正代碼(真實版)

來源:互聯網
上載者:User

標籤:

/*乘法操作

        * 1.返回精確的兩數相乘的結果,解決了精度的問題

        * 2.用此方法返回的結果再調用toFixed方法不會出錯

        */

        function mulFuncion(num1, num2) {

            var totalDigits = 0;

            num1 = num1.toString();

            num2 = num2.toString();

            var numArr1 = num1.split(‘.‘);

            var numArr2 = num2.split(‘.‘);

            try { totalDigits += numArr1[1].length; } catch (e) { }

            try { totalDigits += numArr2[1].length; } catch (e) { }

            var number = num1.replace(‘.‘, ‘‘) * num2.replace(‘.‘, ‘‘);

            return number / Math.pow(10, totalDigits);

        }

 

        /*除法操作

        * 1. 返回精確的兩數相除的結果,解決了精度的問題

        * 2. 用此方法返回的結果再調用toFixed方法不會出錯

        */

        function divFuncion(num1, num2) {

            var decimal1 = 0, decimal2 = 0, decimal1, decimal2;

            try { decimal1 = num1.toString().split(".")[1].length } catch (e) { }

            try { decimal2 = num2.toString().split(".")[1].length } catch (e) { }

            with (Math) {

                decimal1 = Number(num1.toString().replace(".", ""))

                decimal2 = Number(num2.toString().replace(".", ""))

                return (decimal1 / decimal2) * pow(10, decimal2 - decimal1);

            }

        }

 

        /*加法操作

        * 1. 返回精確的兩數相加的結果,解決了精度的問題

        * 2. 用此方法返回的結果再調用toFixed方法不會出錯

        */

        function addFuncion(num1, num2) {

            var decimal1, decimal2, multiple;

            try { decimal1 = num1.toString().split(".")[1].length } catch (e) { decimal1 = 0 }

            try { decimal2 = num2.toString().split(".")[1].length } catch (e) { decimal2 = 0 }

            multiple = Math.pow(10, Math.max(decimal1, decimal2))

            return (num1 * multiple + num2 * multiple) / multiple;

        }

 

        /*減法操作

        * 1. 返回精確的兩數相減的結果,解決了精度的問題

        * 2. 用此方法返回的結果再調用toFixed方法不會出錯

        */

        function subFuncion(num1, num2) {

            var decimal1, decimal2, multiple, maxDecimal;

            try { decimal1 = num1.toString().split(".")[1].length } catch (e) { decimal1 = 0 }

            try { decimal2 = num2.toString().split(".")[1].length } catch (e) { decimal2 = 0 }

            multiple = Math.pow(10, Math.max(decimal1, decimal2));

           

            //動態控制精度長度

            maxDecimal = (decimal1 >= decimal2) ? decimal1 : decimal2;

            return ((num1 * multiple - num2 * multiple) / multiple).toFixed(maxDecimal);

        }

 

/*將number四捨五入到decimals位

        * 1.number可以是數字或數字字串(計算得來的如262.2000000000003這樣的數字也行),不支援科學計數法的數字

        * 2.decimals可以是數字或數字字串(0和負數也行)

        */

        function format_number(number, decimals) {

            if (isNaN(number)) { return 0 };

            if (number == ‘‘) { return 0 };

 

            decimals = parseInt(decimals);

            number = parseFloat(number);

            alert(number);

            var numStr = new String(number);

            var numArr = numStr.split(‘.‘);

            var whole = parseFloat(numArr[0]);

            var result = ‘‘;

 

            // 如果decimals是正數

            if (decimals > 0) {

                if (numArr.length > 1) {

                    var dec = new String(numArr[1]);

                    dec = String(parseFloat(dec) / Math.pow(10, (dec.length - decimals)));

                    dec = String(whole + Math.round(parseFloat(dec)) / Math.pow(10, decimals));

                    var dot = dec.indexOf(‘.‘);

                    if (dot == -1) {

                        dec += ‘.‘;

                        dot = dec.indexOf(‘.‘);

                    }

                    var totalLength = dot + decimals;

                    while (dec.length <= totalLength) {

                        dec += ‘0‘;

                    }

                    result = dec;

                } else {

                    var dot;

                    var dec = new String(whole);

                    dec += ‘.‘;

                    dot = dec.indexOf(‘.‘);

                    while (dec.length <= dot + decimals) { dec += ‘0‘; }

                    result = dec;

                }

            }

            // 如果decimals是負數

            else {

                decimals = 0 - decimals;

                if (numArr[0].length - decimals - 1 < 0) {

                    result = "0";

                } else {

                    var leftLength = numArr[0].toString().length - decimals;

                    whole = parseInt(numStr.substring(0, leftLength));

                    var dec = parseFloat(numStr.substr(leftLength, numStr.length));

                    dec = Math.round(dec / Math.pow(10, decimals));

                    dec = String(whole + dec);

                    while (dec.length < numArr[0].length) {

                        dec += "0";

                    }

                    result = dec;

                }

            }

            return result;

        }

 

js計算誤差修正代碼(真實版)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.