JavaScript 判断两个整数 (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;
- }
- }
- }
来源: http://www.css88.com/qa/javascript/11106.html