JavaScript 小數運算處理方法

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<script>
			/**
			 *JavaScript在處理小數的時候會存在不準確的問題;
			  解決的方法可以是:將小數變爲整數來處理。
			  https://www.jb51.net/article/47803.htm 
			*/
		   
			/**
			 *  https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Math/pow
			    Math.max(value1[,value2, ...]) 
			    參數:value1, value2, ...一組數值
			    返回值:返回給定的一組數字中的最大值。
			    如果給定的參數中至少有一個參數無法被轉換成數字,則會返回 NaN。
			    如果沒有參數,則結果爲 - Infinity
			
				Math.pow() 函數返回基數(base)的指數(exponent)次冪;
				Math.pow(base, exponent) 表示base的exponent次方;
				參數:base基數;exponent 指數;
				如果 base 是 2 ,且 exponent 是 7,
				則 Math.pow() 函數返回 128 (2 的 7 次冪)
			*/
	    /**
		 * 加法 
		 * 計算方式:1.先將所有的小數乘爲整數;
			        2.待加減運算執行完之後再除去對應的 m 的值,將其變爲小數輸出;
		 * */
		function accAdd(arg1,arg2){
			var r1,r2,m;
			//獲取arg1,arg2的小數點後的長度;
			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 m.div(parseFloat(arg1).mul(m)+parseFloat(arg2).mul(m))
			 **/
			return (arg1*m+arg2*m)/m;
		}
		/**
		  * 給Number類型增加一個add方法,調用起來更加方便。
		  *
		  * */
		Number.prototype.add = function (arg){
				return accAdd(arg,this);
		}
		/**
		 * 減法
		 **/
		function accsub(arg1,arg2){
			return accAdd(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);
		}
		/**
		 * 除法 
		 * */
		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);
		}
		/**
		 *  toFixed()實現方法可把 Number 四捨五入爲指定小數位數的數字。
		  * */
		Number.prototype.toFixed=function(len){
			var tempNum=0;
			var s;
			var s1=this+"";
			var start=s1.indexOf(".");
			if(s1.substr(start+len+1,1)>=5){
				tempNum=1
			}
			var temp=Math.pow(10,len);
			s=Math.floor(Math.round(this*temp));
			return s/temp
		};
		
		/**
		 * https://blog.csdn.net/luxxxx/article/details/90177682
		 */
		/**
		 * trim() 方法用於刪除字符串的頭尾空格
		 * \s匹配任何不可見字符,包括空格、製表符、換頁符等等。
		 * 等價於[ \f\n\r\t\v]
		 *   \f: 匹配一個換頁符。等價於\x0c和\cL。
		 *   \n: 匹配一個換行符。等價於\x0a和\cJ。
		 *   \r: 匹配一個回車符。等價於\x0d和\cM。
		 *   \t: 匹配一個製表符。等價於\x09和\cI。
		 *   \v: 匹配一個垂直製表符。等價於\x0b和\cK。
		 * */
		String.prototype.trim=function(){			
			return this.replace(/(^\s*)|(\s*$)/g,"")
		};
		
		//https://www.cnblogs.com/xinggood/p/6639022.html
		console.log("JS加法(0.1+0.2):"+(0.1+0.2));
		var sum=0.1.add(0.2);
		console.log("處理過的結果:"+sum);
		console.log("JS減法(0.3-0.1):"+(0.3-0.1));
		console.log("處理後的結果:"+accsub(0.3,0.1));
		console.log("JS乘法(8.80*12):"+(8.80*12));
		console.log("處理後的結果:"+8.80.mul(12));
		console.log("JS除法"+(100/2));
		/**此處需要轉型原因待研究**/
		console.log("處理後的結果:"+parseFloat(100).div(parseFloat(2)));	
	    //trim();
		var str="    wang tao  ";
		console.log(str.trim());
		console.log("        hello     world           ".trim());
		//toFixed()
		console.log(57.4553.toFixed(3));
		
		</script>
	</head>
	<body>
	</body>
</html>

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章