• 自写小函数处理 javascript 0.3*0.2 浮点类型相乘问题


    const reg = /^([-+]?)([0-9]+).([0-9]*)$/;
    // 判断是不是浮点数
    const isFloat = function(number){
        return reg.test(number);
    }
    // 去除小数点转为整数 0.2 -> 2    1.3 -> 13
    const floatToInt = function(matchArr){
        let symbol = matchArr[1];//正负,没有为 ""
        let head   = matchArr[2];//小数点左边
        let tail   = matchArr[3];//小数点右边
        let result = head + Number(tail);
        return Number(symbol+result);//处理head为0的情况
    }
    // 小数点后的长度e-n n为多少
    const tailLen = function(tail){//tail:String
        return tail.length;
    }
    // 匹配数组包含了小数点左右两边的数据
    const handlerFloat = function(float){//float:Float
        return reg.exec(float);
    
    }
    // 非浮点数的情况下判断传入的数据类型是否为合理数据
    const canHandler = function(data){
        let toString = Object.prototype.toString;
        let isNaN = data => typeof data=== 'number' && data !== + data;
        let isBoolean =  data === true || data === false || toString.call(data) === "[object Boolean]";
        let isNull = data === null;
        let isUndefined = data === void 0;
        let isNumber = toString.call(data) === "[object Number]";
        let isString = toString.call(data) === "[object String]";
        if(isNaN(data) || isBoolean || isNull || isUndefined){
            // throw new Error("only Number or String type");
            console.log(data+" is wrong type,"+"only Number or String type");
            return false;
        }
        let handlerString = data =>{
            if(isNaN(Number(data))){
                console.log(data+" is wrong string : ");
                return false;
            }
            return true;
        }
        return isNumber || (isString && handlerString(data));
    }
    // 浮点数乘以浮点数 0.2*0.3
    const floatMultFloat = function(f1,f2){
        // console.log("floatMultFloat");
        var eNum1,eNum2,match1,match2,int1,int2;
        // 匹配数组
        match1 = handlerFloat(f1);
        match2 = handlerFloat(f2);
        //小数点后 这里用于转为科学计数法 
        eNum1  = match1[3].length;
        eNum2  = match2[3].length;
        // 去掉小数点 转为整数
        int1   = floatToInt(match1);
        int2   = floatToInt(match2);
        // 0.2*0.3 = 2*3*(e-2) = (2*3)/100
        return (int1*int2)/(Math.pow(10,(eNum1+eNum2)));    
    }
    // 整数乘以浮点数 12*0.2
    const intMultFloat = function(int,float){
        // console.log("intMultFloat");
        let eNum,match,fInt;
        match = handlerFloat(float);
        eNum  = match[3].length;
        fInt  = floatToInt(match);
        return (int*fInt)/(Math.pow(10,eNum));
    }
    
    const condition = function(f1,f2){
        if(isFloat(f1)){
            return isFloat(f2) ?  floatMultFloat(f1,f2) : ( canHandler(f2) ? intMultFloat(f2,f1) : -1);
        }
        return false;    
    }
    
    // API
    const floatMult=function(f1,f2){
        let result1,result2;
    
        result1 =condition(f1,f2);
        if(result1 !== false){
            return result1 === -1 ? false : result1;
        };
    
        result2 =condition(f2,f1);
        if(result2 !== false){
            return result2 === -1 ? false : result2;
        };
    
        // console.log("intMultInt");
        return  canHandler(f1) && canHandler(f2) && f1 * f2 ;
    }
    
    // 暴露接口
    module.exports = floatMult;
    
    // 基本测试
    console.log(floatMult(0.2,0.3));//0.06
    console.log(floatMult(1.3,1.2));//1.56
    console.log(floatMult(123.4,6456.3));//796707.42
    console.log(floatMult(.2,.3));//0.06
    console.log(floatMult(1,0.3));//0.3
    console.log(floatMult(12,55));//660
    // 字符串和数字类型测试
    console.log(floatMult("0.2","0.3"));//0.06
    console.log(floatMult("0.2",0.3));//0.06
    console.log(floatMult("12","25"));//300
    console.log(floatMult("12",55));//660
    console.log(floatMult("1.3.3",1.3));//false  "1.3.1 is wrong string :"
    // 其他类型测试
    console.log(floatMult(true,0.3));//false     "true is wrong type, only Number or String type"
    console.log(floatMult(null,0.2));//false     "null is wrong type, only Number or String type"
    console.log(floatMult(void 0,0.3));//false   "undefined is wrong type, only Number or String type"
    console.log(floatMult(void 0,null));//false  "undefined is wrong type, only Number or String type"
    console.log(floatMult(1,false));//false      "false is wrong type, only Number or String type"
    // 正负测试
    console.log(floatMult(-0.2,-0.3));//0.06
    console.log(floatMult("-0.2",-0.3));//0.06
    console.log(floatMult("-0.2","-0.3"));//0.06
    console.log(floatMult(12,"-0.2"));//-2.4
    console.log(floatMult("+12",+.3));//3.6
  • 相关阅读:
    用了7年做到项目经理,女朋友却离开了我
    手把手教你建网站--程序小白适用篇
    燃尽图的学习与理解
    每周进度
    四人组队
    读构建之法之感
    两人组队,小学生的四则运算
    词汇统计
    AMQP中的架构和组成元素
    MSSQL机制
  • 原文地址:https://www.cnblogs.com/lantuoxie/p/7551114.html
Copyright © 2020-2023  润新知