• javascript 精确加减乘除


          最近一个项目中要使用 JS 实现自动计算的功能,本以为只是实现简单的加、减、乘、除就可以了,于是三下五除二做完了。

          正当我窃喜的时候,发现问题了。。。

          进行一些浮点数运算时,计算结果都是让我大跌眼镜啊,那个值让我哭笑不得,一长串的值,太牛了。。。

          我那个纳闷啊!!不过还好牛人多,给了我一解决方案,嘿嘿。。。问题基本上解决了,为了表示感觉,我决定把代码贴出来,大家共享一下,希望能给部分人一些帮助。

    Js代码 复制代码 收藏代码
    1. //加法函数  
    2. function accAdd(arg1, arg2) {  
    3.     var r1, r2, m;  
    4.     try {  
    5.         r1 = arg1.toString().split(".")[1].length;  
    6.     }  
    7.     catch (e) {  
    8.         r1 = 0;  
    9.     }  
    10.     try {  
    11.         r2 = arg2.toString().split(".")[1].length;  
    12.     }  
    13.     catch (e) {  
    14.         r2 = 0;  
    15.     }  
    16.     m = Math.pow(10, Math.max(r1, r2));  
    17.     return (arg1 * m + arg2 * m) / m;  
    18. }   
    19. //给Number类型增加一个add方法,,使用时直接用 .add 即可完成计算。   
    20. Number.prototype.add = function (arg) {  
    21.     return accAdd(arg, this);  
    22. };  
    23.   
    24. //减法函数  
    25. function Subtr(arg1, arg2) {  
    26.     var r1, r2, m, n;  
    27.     try {  
    28.         r1 = arg1.toString().split(".")[1].length;  
    29.     }  
    30.     catch (e) {  
    31.         r1 = 0;  
    32.     }  
    33.     try {  
    34.         r2 = arg2.toString().split(".")[1].length;  
    35.     }  
    36.     catch (e) {  
    37.         r2 = 0;  
    38.     }  
    39.     m = Math.pow(10, Math.max(r1, r2));  
    40.      //last modify by deeka  
    41.      //动态控制精度长度  
    42.     n = (r1 >= r2) ? r1 : r2;  
    43.     return ((arg1 * m - arg2 * m) / m).toFixed(n);  
    44. }  
    45.   
    46. //给Number类型增加一个add方法,,使用时直接用 .sub 即可完成计算。   
    47. Number.prototype.sub = function (arg) {  
    48.     return Subtr(this, arg);  
    49. };  
    50.   
    51. //乘法函数  
    52. function accMul(arg1, arg2) {  
    53.     var m = 0, s1 = arg1.toString(), s2 = arg2.toString();  
    54.     try {  
    55.         m += s1.split(".")[1].length;  
    56.     }  
    57.     catch (e) {  
    58.     }  
    59.     try {  
    60.         m += s2.split(".")[1].length;  
    61.     }  
    62.     catch (e) {  
    63.     }  
    64.     return Number(s1.replace(".", "")) * Number(s2.replace(".", "")) / Math.pow(10, m);  
    65. }   
    66. //给Number类型增加一个mul方法,使用时直接用 .mul 即可完成计算。   
    67. Number.prototype.mul = function (arg) {  
    68.     return accMul(arg, this);  
    69. };   
    70.   
    71. //除法函数  
    72. function accDiv(arg1, arg2) {  
    73.     var t1 = 0, t2 = 0, r1, r2;  
    74.     try {  
    75.         t1 = arg1.toString().split(".")[1].length;  
    76.     }  
    77.     catch (e) {  
    78.     }  
    79.     try {  
    80.         t2 = arg2.toString().split(".")[1].length;  
    81.     }  
    82.     catch (e) {  
    83.     }  
    84.     with (Math) {  
    85.         r1 = Number(arg1.toString().replace(".", ""));  
    86.         r2 = Number(arg2.toString().replace(".", ""));  
    87.         return (r1 / r2) * pow(10, t2 - t1);  
    88.     }  
    89. }   
    90. //给Number类型增加一个div方法,,使用时直接用 .div 即可完成计算。   
    91. Number.prototype.div = function (arg) {  
    92.     return accDiv(this, arg);  
    93. };   
    //加法函数
    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方法,,使用时直接用 .add 即可完成计算。 
    Number.prototype.add = function (arg) {
    	return accAdd(arg, this);
    };
    
    //减法函数
    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);
    }
    
    //给Number类型增加一个add方法,,使用时直接用 .sub 即可完成计算。 
    Number.prototype.sub = function (arg) {
    	return Subtr(this, arg);
    };
    
    //乘法函数
    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方法,使用时直接用 .mul 即可完成计算。 
    Number.prototype.mul = function (arg) {
    	return accMul(arg, this);
    }; 
    
    //除法函数
    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方法,,使用时直接用 .div 即可完成计算。 
    Number.prototype.div = function (arg) {
    	return accDiv(this, arg);
    }; 

     使用方法:

    Js代码 复制代码 收藏代码
    1. //加法示例(其它的都类似)  
    2. function calculate() {  
    3.     //数字1  
    4.                 var num1 = 10;  
    5.                 //数字2  
    6.                 var num2 = 5;  
    7.                 //计算 num1 + num2  
    8.                 alert(num1.add(num2));  
    9. }  
    //加法示例(其它的都类似)
    function calculate() {
    	//数字1
                    var num1 = 10;
                    //数字2
                    var num2 = 5;
                    //计算 num1 + num2
                    alert(num1.add(num2));
    }
  • 相关阅读:
    TP5手动引入PHPEXCEL的方法
    分库分表的基本思想
    FIFO、LRU、LFU的含义和原理
    Memcache 内存分配策略和性能(使用)状态检查
    php soapclient 超时 设置
    jsonrpc.js -- 原生js实现 JSON-RPC 协议
    前端编译原理 笔记 -- BISON
    前端编译原理 移进规约自动机
    前端编译原理 parser.js源码解读
    react-rotuer动态加载模块
  • 原文地址:https://www.cnblogs.com/firstdream/p/6768488.html
Copyright © 2020-2023  润新知