自写小函数处理 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));//
// 字符串和数字类型测试
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 浮点类型相乘问题的更多相关文章
- javascript学习笔记(四) Number 数字类型
数字格式化方法toFixed().toExponential().toPrecision(),三个方法都四舍五入 toFixed() 方法指定小数位个数 toExponential() 方法 用科学 ...
- 用javascript 写个函数返回一个页面里共使用了多少种HTML 标签
今天我无意间看到一个面试题: 如何用javascript 写个函数返回一个页面里共使用了多少种HTML 标签? 不知你看到 是否蒙B了,如果是我 面试,肯定脑子嗡嗡的响.... 网上搜了搜也没有找到答 ...
- JS写小游戏(一):游戏框架
前言 前一阵发现一个不错的网站,都是一些用html5+css+js写的小游戏,于是打算学习一番,写下这个系列博客主要是为了加深理解,当然也有一些个人感悟,如果英文好可以直接Click Here. 概述 ...
- canvas学习笔记、小函数整理
http://bbs.csdn.net/topics/391493648 canvas实例分享 2016-3-16 http://bbs.csdn.net/topics/390582151 html5 ...
- 自己写的HTML5 Canvas + Javascript五子棋
看到一些曾经只会灌水的网友,在学习了前端之后,已经能写出下载量几千几万的脚本.样式,帮助大众,成为受欢迎的人,感觉满羡慕的.我也想学会前端技术,变得受欢迎呀.于是心血来潮,开始学习前端知识,并写下了这 ...
- 【原】小搞一下 javascript算法
前言:在前端大全中看到这句话,以此共勉.基础决定你可能达到的高度, 而业务决定了你的最低瓶颈 其实javascript算法在平时的编码中用处不大,不过不妨碍我们学习它,学习一下这些算法的思想,锻炼一下 ...
- 使用getopt_long来解析参数的小函数模板
getopt_long原型 #define no_argument 0 #define required_argument 1 #define optional_argument 2 struct o ...
- 几个非常有用的js小函数
function $(v){ if(typeof v==="function"){ window.onload=v; }else if(typeof v==="strin ...
- JS_ECMA基本语法中的几种封装的小函数-2
大家好!今天继续给大家写一下ECMA中的剩下的小函数以及实用的实例: 首先先给大家说一下字符串.数组.数学方法以及json的一点小知识点: 字符串方法: str.length str.charAt(i ...
随机推荐
- Html5shiv ---- 让IE低版本浏览器识别并支持HTML5标签
Html5shiv.js是针对IE浏览器的 javaScript 补丁,作用如题 该脚本的下载链接 使用使在head标签中使用script标签引用即可
- JSON脱敏
https://blog.csdn.net/yuan487639/article/details/79151344
- ZooKeeper-3.3.4集群安装配置(转载)
ZooKeeper是一个分布式开源框架,提供了协调分布式应用的基本服务,它向外部应用暴露一组通用服务——分布式同步(Distributed Synchronization).命名服务(Naming S ...
- css水平垂直居中块整理
1.绝对定位+负margin 兼容性很好,但需要指定子块的高度和宽度,以及负margin .wp{ position: relative; width: 200px; height: 200px; b ...
- gdb手册
摘自:https://github.com/hellogcc/100-gdb-tips/blob/master/src/quit-gdb-silently.md. 我只是摘抄我平时没注意到的,或者我认 ...
- Gym - 101147J Whistle's New Car 树上差分
J. Whistle's New Car time limit per test 15 seconds memory limit per test 512 megabytes input car.in ...
- 8593 最大覆盖问题 two pointer
8593 最大覆盖问题 时间限制:50MS 内存限制:1000K提交次数:193 通过次数:88 题型: 编程题 语言: G++;GCC;VC Description 输入格式 第1行是正整数n ...
- Nginx 开启多核cpu配置
nginx默认是没有开启利用多核cpu的配置的.需要通过增加worker_cpu_affinity配置参数来充分利用多核cpu; 需要在nginx配置里添加 worker_processes 和 or ...
- django的基础知识
在settings.py文件中,settings文件中顶部的INSTALLED_APPS设置项.它列出了所有的项目中被激活的Django应用(app).你必须将你自定义的app注册在这里.每个应用可以 ...
- spring cloud各种超时时间设置
如果是zuul(网关)的超时时间需要设置zuul.hystrix.ribbon等三部分: #zuul超时设置#默认1000zuul.host.socket-timeout-millis=2000#默认 ...