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

const reg = /^([0-9]+)\.([0-9]*)$/;
// 判断是不是浮点数
const isFloat = function(number){
    return reg.test(number);
}

// 去除小数点转为整数
const floatToInt = function(head,tail){//head:String tail:String
    // head和tail都是字符串 Number("005")可以去零
    let result = head + Number(tail);
    return Number(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 = typeof data === ‘number‘ || toString.call(data) === "[object Number]";
    let isString = typeof data === ‘string‘ || toString.call(data) === "[object String]";
    if(isNaN(data) || isBoolean || isNull || isUndefined){
        // throw new Error("only Number or String type");
        console.log("only Number or String type");
        return false;
    }
    return isNumber || (isString && !isNaN(Number(data)));
}

// API
const floatMult=function(f1,f2){
    if(isFloat(f1) && isFloat(f2)){
        var eNum1,eNum2,match1,match2,int1,int2;
        // 匹配数组
        match1 = handlerFloat(f1);
        match2 = handlerFloat(f2);
        //小数点后 这里用于转为科学计数法
        eNum1  = match1[2].length;
        eNum2  = match2[2].length;
        // 去掉小数点 转为整数
        int1   = floatToInt(match1[1],match1[2]);
        int2   = floatToInt(match2[1],match2[2]);
        // 0.2*0.3 = 2*3*(e-2) = (2*3)/100
        return (int1*int2)/(Math.pow(10,(eNum1+eNum2)));

    }else{
        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
console.log(floatMult(true,0.3));//false "only Number or String type"
console.log(floatMult(null,0.2));//false "only Number or String type"
console.log(floatMult(void 0,0.3));//false "only Number or String type"
时间: 2024-12-18 01:14:34

自写小函数处理 javascript 0.3*0.2 浮点类型相乘问题的相关文章

用正则表达式写trim函数(javascript)

function trim(str){ return str.replace(/(^\s*)|(\s*$)/g, "");//删除左右两端的空格 } function ltrim(str){ return str.replace(/(^\s*)/g,"");//删除左边的空格 } function rtrim(str){ return str.replace(/(\s*$)/g,""); //删除右边的空格 } 测试 function trim(

把注释写到函数内部 -- 轻松生成 JavaScript API Doc

在线演示 http://runjs.cn/detail/bjk0zqfl (function () { // 用闭包写 js 是最常规的方法 var api = this.Api = {}; // 这个简单正则下面要要用 var ez = /^function.+\((.*)\)\s*{\s*\/\*+([\S\s]*)\*+\//; // 一些私有方法, 不暴露到 api 给用户使用 function private(){ // something } // 下面的 api.show 是用户可

JS写小游戏(一):游戏框架

前言 前一阵发现一个不错的网站,都是一些用html5+css+js写的小游戏,于是打算学习一番,写下这个系列博客主要是为了加深理解,当然也有一些个人感悟,如果英文好可以直接Click Here. 概述 一般,小游戏都要关注两个问题:刷新和交互.因为游戏一般是动态的,所以需要不断刷新.JavaScript是单线程,如果用C语言写过贪吃蛇之类的小游戏,应该知道,单线程一般是挂起一个时间来达到动态效果.比如C语言的Sleep(),JS的setInterval()等.但是js还有一种更高性能的方法req

JS_ECMA基本语法中的几种封装的小函数-2

大家好!今天继续给大家写一下ECMA中的剩下的小函数以及实用的实例: 首先先给大家说一下字符串.数组.数学方法以及json的一点小知识点: 字符串方法: str.length str.charAt(i):取字符串中的某一个; str.indexOf('e');找第一个出现的位置;找不到返回-1; str.lastIndexOf('e'):找最后一个e出现的位置;找不到返回-1; str.toUpperCase();转大写 str.toLowerCase();转小写 str.substring(起

JS_ECMA基本语法中的几种封装的小函数

先来回顾一下我们的字符串: 字符串方法: str.length str.charAt(i):取字符串中的某一个; str.indexOf('e');找第一个出现的位置;找不到返回-1; str.lastIndexOf('e'):找最后一个e出现的位置;找不到返回-1; str.toUpperCase();转大写 str.toLowerCase();转小写 str.substring(起始位置,结束位置):字符串截取; str.split('切割的方式');字符串切割;字符串转数组;数组方法:删除

使用getopt_long来解析参数的小函数模板

getopt_long原型 #define no_argument 0 #define required_argument 1 #define optional_argument 2 struct option { const char *name; //名称,下面实例中使用的--help,--version int has_arg; //是否有参数,可选0,1,2三个值,就是上面的那三个宏定义 int *flag; //返回值,传入的一个int指针,表示该参数的解析结果,如果是NULL,那么返

PHP小函数集-篇一

一. 验证 /** * 判断用户名是否规范 */ function is_username($username) { if (preg_match("/^[a-zA-Z]{1}([0-9a-zA-Z]|[._]){3,19}$/",$username)) { return true; } } /** * 判断密码是否规范 */ function is_password($password) { if (preg_match("/^[\@A-Za-z0-9\!\#\$\%\^\

经典笔试题:用C写一个函数测试当前机器大小端模式

“用C语言写一个函数测试当前机器的大小端模式”是一个经典的笔试题,如下使用两种方式进行解答: 1. 用union来测试机器的大小端 1 #include <stdio.h> 2 3 union test 4 { 5 int a; 6 char b; 7 }; 8 9 int endian_test(void) 10 { 11 union test t1; 12 t1.a = 1; 13 return t1.b; 14 } 15 16 int main(void) 17 { 18 int i =

日期相关的小函数汇总

在写日历组件和旅行相关频道开发的过程中,很多需要地方需要和日期对象打交道.拿京东旅游首页来说, 左上角的搜索框就包含了许多日期相关的交互逻辑,它包含了机票,酒店,度假等,这些都含有出发日期,到达日期等. 里面还包含了一个日期组件,在用户选择完出发日期后,会自动把到达日期定位在出发日期的下一天. 又如机票低价日历 还有度假的这种特殊日历 以下是经常需要用到日期相关小函数 一. 判断闰年这个函数在日历组件是必须要的,闰年的2月是29天,非闰年是28天 /* * 判断闰年 * @param {Numb