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));//
// 字符串和数字类型测试
console.log(floatMult("0.2","0.3"));//0.06
console.log(floatMult("0.2",0.3));//0.06
console.log(floatMult("12","25"));//
console.log(floatMult("12",55));//
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

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

  1. javascript学习笔记(四) Number 数字类型

    数字格式化方法toFixed().toExponential().toPrecision(),三个方法都四舍五入 toFixed() 方法指定小数位个数  toExponential() 方法 用科学 ...

  2. 用javascript 写个函数返回一个页面里共使用了多少种HTML 标签

    今天我无意间看到一个面试题: 如何用javascript 写个函数返回一个页面里共使用了多少种HTML 标签? 不知你看到 是否蒙B了,如果是我 面试,肯定脑子嗡嗡的响.... 网上搜了搜也没有找到答 ...

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

    前言 前一阵发现一个不错的网站,都是一些用html5+css+js写的小游戏,于是打算学习一番,写下这个系列博客主要是为了加深理解,当然也有一些个人感悟,如果英文好可以直接Click Here. 概述 ...

  4. canvas学习笔记、小函数整理

    http://bbs.csdn.net/topics/391493648 canvas实例分享 2016-3-16 http://bbs.csdn.net/topics/390582151 html5 ...

  5. 自己写的HTML5 Canvas + Javascript五子棋

    看到一些曾经只会灌水的网友,在学习了前端之后,已经能写出下载量几千几万的脚本.样式,帮助大众,成为受欢迎的人,感觉满羡慕的.我也想学会前端技术,变得受欢迎呀.于是心血来潮,开始学习前端知识,并写下了这 ...

  6. 【原】小搞一下 javascript算法

    前言:在前端大全中看到这句话,以此共勉.基础决定你可能达到的高度, 而业务决定了你的最低瓶颈 其实javascript算法在平时的编码中用处不大,不过不妨碍我们学习它,学习一下这些算法的思想,锻炼一下 ...

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

    getopt_long原型 #define no_argument 0 #define required_argument 1 #define optional_argument 2 struct o ...

  8. 几个非常有用的js小函数

    function $(v){ if(typeof v==="function"){ window.onload=v; }else if(typeof v==="strin ...

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

    大家好!今天继续给大家写一下ECMA中的剩下的小函数以及实用的实例: 首先先给大家说一下字符串.数组.数学方法以及json的一点小知识点: 字符串方法: str.length str.charAt(i ...

随机推荐

  1. [Xcode 实际操作]九、实用进阶-(11)系统本地通知的创建和使用

    目录:[Swift]Xcode实际操作 本文将演示系统本地通知的创建和使用. 在项目导航区,打开视图控制器的代码文件[ViewController.swift] import UIKit //引入需要 ...

  2. 原生js回到顶部

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...

  3. ubuntu 安装 RPostgreSQL 库

    其实大家在Linux 的R 中安装其他库,完全可以使用R 自带的安装方式,只是这个 RPostgreSQL 库需要用到 postgresql 的lib 库与include 头文件,所以才有若干个步骤去 ...

  4. StringUitl工具类中的一种写法

    typeHandlersPackageArray = StringUtils.tokenizeToStringArray(this.typeAliasesPackage, ",; \t\n& ...

  5. jmeter diff测试

    1.准备接口数据(对比字段,即json数据中需要提取的key对应的值进行对比) 2.配置获取EXCEL数据 3.新建线程,并建两个http请求,分别用于请求新旧接口 4.提取需要对比的内容 5.赋值变 ...

  6. 转 SecureCRT中文乱码解决方法

    1. 打开对话窗口,在工具栏中点开“选项”,选择“会话选项”.  2. 在打开的“会话选项”中,选择“外观”.  3. 在显示的“窗口和文本外观”中找到“字符编码”.  4. 把“字符编码”设置为“U ...

  7. Windows下打开某些软件时显示显卡驱动不是最新的问题

    在Windows下打开某些对显卡要求比较高的软件时,会出现某些显卡驱动不是最新,要求更新到最新的提示,但是当你真的去更新显卡驱动的时候,却发现现在的显卡驱动已经是最新了,那么为什么还会有这样的提示呢, ...

  8. ruby 正则匹配返回值matchdata

    引用连接: 为处理与正则表达式的匹配过程相关的信息而设置的类. 可以通过下列途径 Regexp.last_match Regexp#match, String#match $~ 得到该类的实例. 超类 ...

  9. SQL server函数

    一般在开发中用到的函数 标量函数用的比较多 标量函数:就是返回一个单一的结果值 下面介绍一下标量函数的语法 create function GetFunction  --创建函数 (   @name ...

  10. 常用的 JavaScript 简写方法

    1.三元操作符 当想写 if...else 语句时,使用三元操作符来代替. const x = 20; let answer; if (x > 10) {    answer = 'is gre ...