自写小函数处理 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 ...
随机推荐
- CSproject文件总是在Solution中被修改PROJECT GUID问题
1.情况: 打开2个Solution 一个是client,一个是server 他们会互相修改GUID,切换solution的时候都会显示 xxxxx已经被外部修改云云 2.原因: 一般是在其中一个So ...
- 51nod1076(tarjan)
题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1076 题意:中文题诶- 思路:先用tarjan找出所有桥,再用 ...
- Ajax登陆,使用Spring Security缓存跳转到登陆前的链接
Spring Security缓存的应用之登陆后跳转到登录前源地址 什么意思? 用户访问网站,打开了一个链接:(origin url)起源链接 请求发送给服务器,服务器判断用户请求了受保护的资源. 由 ...
- 码云最火爆开源项目 TOP 50,你都用过哪些?
前 20 名预览 排名软件排名软件 1zheng11AOSuite 2JFinal12Spiderman 3t-io13AG-Admin 4guns14renren-security 5hutool1 ...
- 《统计学习方法》笔记九 EM算法及其推广
本系列笔记内容参考来源为李航<统计学习方法> EM算法是一种迭代算法,用于含有隐变量的概率模型参数的极大似然估计或极大后验概率估计.迭代由 (1)E步:求期望 (2)M步:求极大 组成,称 ...
- 表单辅助函数-form_open()
使用from_open()之前需要装载本辅助函数: $this->load->helper('form'); php===> echo form_open('email/send') ...
- 系统讲解一下,Dao,Entity,Servlet,Action各自有什么东西-Java/Web开发
dao 主要是一些接口,里面定义了一些用于增删改查的方法名 daoImpl 就是对dao的具体实现 Service 同上,也是一些接口,主要是用来调用dao层的一些方法,所以这里定义的方法一般都定义好 ...
- html 手机端click 事件延迟问题(fastclick.js使用方法)
下载地址: fastclick.js 为什么存在延迟? 从点击屏幕上的元素到触发元素的 click 事件,移动浏览器会有大约 300 毫秒的等待时间.为什么这么设计呢? 因为它想看看你是不是要进行双击 ...
- postman中添加cookie信息
日常测试中有部分接口请求需要有登录信息,否则调用报错,那如何在postman中添加用户的cookie呢,主要分2个步骤: 第一步: Charles抓包获取Headers信息,拷贝Headers中的Co ...
- 删除所有约束、表、视图等SQL脚本
--删除所有约束.表.视图等SQL脚本 --############################################### --删除所有外键约束 --################# ...