自写小函数处理 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 ...
随机推荐
- Integrated Metabolomics and Lipidomics Analyses Reveal Metabolic Reprogramming in Human Glioma with IDH1 Mutation (文献分享一组-黄旭蕾)
题目:Integrated Metabolomics and Lipidomics Analyses Reveal Metabolic Reprogramming in Human Glioma wi ...
- DB2 学习--(1)--安装教程
db2 linux 安装部署 1 解压文件 tar -zxvf db2_v101_linuxx64_expc.tar.gz 2 切换路径 cd expc/ 3 启动安装程序 ./db2_install ...
- gcd(2018.10.24)
良心题,暴力枚举即可. 代码: #include<cstdio> #include<cmath> #include<algorithm> using namespa ...
- python操作redis之String操作
# __author__ = 'STEVEN' import redis,time # 方式1,直接链接操作 # r = redis.Redis(host='192.168.43.22',port=6 ...
- 根据日期计算发布时间段(NSCalendar)
// 返回发布时间dateWithString - (NSString *)backReleaseTimeWithDateStr:(NSString *)dateWithString{ // 获取当前 ...
- 实现如下语法的功能:var a = add(2)(3)(4)
function add(num){ var _add = function(args){ num+=args; return arguments.callee; } _add.toString = ...
- Eclipse+Tomcat环境集成
1.下载Eclipse: 我用的Version: Mars.2 Release (4.5.2),直接在官网上下:http://www.eclipse.org/downloads/packages/re ...
- 集合框架比较两个对象是否相同(equals和hashCode方法)
package com.dcz.hashset; import java.util.HashSet; import java.util.Set; /** * HashSet是接口最常用的实现类,顾名思 ...
- 利用js日期控件重构WEB功能
开发需求:网页中的日期部门(注册页面和查询条件)都用js日期控件重写 页面一:更新员工页面 empUpdate.jsp 中增加 onfocus 事件 入职日期:<input id="h ...
- Ubuntu 14.04 配置confluence破解
1. 配置java环境,请参展我的另一篇博客 http://www.cnblogs.com/youran-he/p/8607155.html 2. 下载文件 https://pan.baidu.com ...