自写小函数处理 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 ...
随机推荐
- OPENGL0_简介
opengl定义: Open Graphics Library,开放图形程序接口,跨平台,跨语言.提供了与底层图形硬件的接口,是一个功能强大的底层图形库. opengl库种类: gl:核心库,常规,核 ...
- A - Cake (+极角+凸包)
#include<stdio.h> #include<string.h> #include<algorithm> #include<math.h> us ...
- java简单操作redis数据库
package RedisTest; import redis.clients.jedis.Jedis; public class RedisTest { private static String ...
- Python入门小练习
Python入门小练习 001 备份文件 Python入门小练习 002 批量下载网页链接中的图片 Python入门小练习 003 利用cookielib模拟登录获取账户信息
- 消息队列介绍、RabbitMQ&Redis的重点介绍与简单应用
消息队列介绍.RabbitMQ&Redis的重点介绍与简单应用 消息队列介绍.RabbitMQ.Redis 一.什么是消息队列 这个概念我们百度Google能查到一大堆文章,所以我就通俗的讲下 ...
- 通过API获取统计信息时报Access denied错误处理记录
通过API获取HDFS统计信息时报Access denied错误信息,错误信息如下: org.apache.hadoop.ipc.RemoteException(org.apache.hadoop.s ...
- crontab 在unix 没有执行。
Quote: 引用 2 楼 jdwq33 的回复: Quote: 引用 1 楼 mp777323 的回复: 03 * * * * sh /opt/pro_some.sh 我试过了,这样也不行,难道是我 ...
- Mysql5.7安装错误处理与主从同步及!
basedir=/iddbs/mysql-5.7.16 datadir=/iddbs/mysql5.7/data3306 一.自定义Mysql.5.7版本免编译安装: 1.Db-server1安装前期 ...
- 对shell的简单认识
shell是一个命令解释器: shell分为交互式shell和非交互式shell: 交互式shell就是命令行一问一答:非交互式shell是像shell文本那样,一次解析文本, 并未在命令行给我们作出 ...
- DockerSwarm 集群环境搭建
一.简介 1. 什么是docker swarm? Swarm 在 Docker 1.12 版本之前属于一个独立的项目,在 Docker 1.12 版本发布之后,该项目合并到了 Docker 中,成为 ...