1. 程式人生 > >JS判斷兩個數(包含小數)是否能夠整除

JS判斷兩個數(包含小數)是否能夠整除

   JS判斷兩個整數(a,b,a>b)的整除時,可以用Number.isInteger(a/b)或者a%b==0來進行判斷,但是如果其中涉及到小數就會導致計算過程中精度丟失.

最簡單的精度丟失例子,如0.1+0.2==0.3(false).

相同的道理,a%b==0判斷並不可取,如11%1.1=1.0999999999999992.則11%1.1==0為false.

同樣的Number.isInteger(a/b)判斷也不可取,如0.3/0.1=2.9999999999999996,則Number.isInteger(0.3/0.1)為false.

所以為了避免精度丟失,計算結果不正確,可以採用先轉化為整數計算.下面提供兩種方法,但本質上是一種

第一種方法,編寫兩個方法getIntegerTimes(),isPositiveIntegerTimes()判斷兩個數(包含小數),先獲取倍數,再判斷倍數是否為正整數,好處就是兩個方法都可以作為通用方法呼叫.實現功能多.

//獲取兩個數的倍數,返回倍數
function getIntegerTimes(arg1,arg2){
	if(arg1<arg2){
		var flag=arg1;
		arg1=arg2;
		arg2=arg1;
	}
	
	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);
	}
}

//判斷是否為正整數,返回true或false
function isPositiveIntegerTimes(arg) {
	var num = arg.toString();
	if (!(/(^[1-9]\d*$)/.test(num))) {
		return false;
	}
	else {
		return true;
	}
}
第二種方法,就是單一方法isPositiveIntegerTimes(),判斷兩個數(包含小數)是否整除
//判斷兩個數的是否為整數倍,返回true或者false
function isPositiveIntegerTimes(arg1,arg2){
	if(arg1<arg2){
		var flag=arg1;
		arg1=arg2;
		arg2=arg1;
	}
	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(".",""));
		var times= (r1/r2)*pow(10,t2-t1);

		if (!(/(^[1-9]\d*$)/.test(times.toString()))) {
			return false;
		}
		else {
			return true;
		}
	}
}