Jquery精准计算
一、事件发生:在进行ParseFloat(sum/length)==Parsefloat(7)之时,发现ParseFloat(sum/length)的结果出现了6.99999999999
二、解决办法:引入精确计算js文件,如下:
/*** @desc 解决浮动运算问题,避免小数点后产生多位数和计算精度损失。* 问题示例:2.3 + 2.4 = 4.699999999999999,1.0 - 0.9 = 0.09999999999999998*/ /*** 把错误的数据转正* strip(0.09999999999999998)=0.1*/ function strip(num, precision) {if (precision === void 0) { precision = 12; }return +parseFloat(num.toPrecision(precision)); } /*** Return digits length of a number* @param {*number} num Input number*/ function digitLength(num) {// Get digit length of evar eSplit = num.toString().split(/[eE]/);var len = (eSplit[0].split('.')[1] || '').length - (+(eSplit[1] || 0));return len > 0 ? len : 0; } /*** 把小数转成整数,支持科学计数法。如果是小数则放大成整数* @param {*number} num 输入数*/ function float2Fixed(num) {if (num.toString().indexOf('e') === -1) {return Number(num.toString().replace('.', ''));}var dLen = digitLength(num);return dLen > 0 ? strip(num * Math.pow(10, dLen)) : num; } /*** 检测数字是否越界,如果越界给出提示* @param {*number} num 输入数*/ function checkBoundary(num) {if (_boundaryCheckingState) {if (num > Number.MAX_SAFE_INTEGER || num < Number.MIN_SAFE_INTEGER) {console.warn(num + " is beyond boundary when transfer to integer, the results may not be accurate");}} } /*** 精确乘法*/ function times(num1, num2) {var others = [];for (var _i = 2; _i < arguments.length; _i++) {others[_i - 2] = arguments[_i];}if (others.length > 0) {return times.apply(void 0, [times(num1, num2), others[0]].concat(others.slice(1)));}var num1Changed = float2Fixed(num1);var num2Changed = float2Fixed(num2);var baseNum = digitLength(num1) + digitLength(num2);var leftValue = num1Changed * num2Changed;checkBoundary(leftValue);return leftValue / Math.pow(10, baseNum); } /*** 精确加法*/ function plus(num1, num2) {var others = [];for (var _i = 2; _i < arguments.length; _i++) {others[_i - 2] = arguments[_i];}if (others.length > 0) {return plus.apply(void 0, [plus(num1, num2), others[0]].concat(others.slice(1)));}var baseNum = Math.pow(10, Math.max(digitLength(num1), digitLength(num2)));return (times(num1, baseNum) + times(num2, baseNum)) / baseNum; } /*** 精确减法*/ function minus(num1, num2) {var others = [];for (var _i = 2; _i < arguments.length; _i++) {others[_i - 2] = arguments[_i];}if (others.length > 0) {return minus.apply(void 0, [minus(num1, num2), others[0]].concat(others.slice(1)));}var baseNum = Math.pow(10, Math.max(digitLength(num1), digitLength(num2)));return (times(num1, baseNum) - times(num2, baseNum)) / baseNum; } /*** 精确除法*/ function divide(num1, num2) {var others = [];for (var _i = 2; _i < arguments.length; _i++) {others[_i - 2] = arguments[_i];}if (others.length > 0) {return divide.apply(void 0, [divide(num1, num2), others[0]].concat(others.slice(1)));}var num1Changed = float2Fixed(num1);var num2Changed = float2Fixed(num2);checkBoundary(num1Changed);checkBoundary(num2Changed);return times((num1Changed / num2Changed), Math.pow(10, digitLength(num2) - digitLength(num1))); } /*** 四舍五入*/ function round(num, ratio) {var base = Math.pow(10, ratio);return divide(Math.round(times(num, base)), base); } var _boundaryCheckingState = true; /*** 是否进行边界检查,默认开启* @param flag 标记开关,true 为开启,false 为关闭,默认为 true*/ function enableBoundaryChecking(flag) {if (flag === void 0) { flag = true; }_boundaryCheckingState = flag; }
转载于:https://www.cnblogs.com/CherishZeng/p/10963412.html
Jquery精准计算相关推荐
- MES计件工资——实现工资精准计算的重要工具
计件工资是一种按照工人完成的工作量来计算工资的方式,它与传统的计时工资相比,更能激发员工的生产积极性和工作热情.而MES系统则是一种能够帮助企业实现生产过程管理和控制的软件系统.它可以涵盖生产计划.生 ...
- Python 超级简单精准计算地点日出日落时间
原文来自Python实用宝典:Python 超级简单精准计算地点日出日落时间 本来想浪漫一把去看个日出,过去后看见天上挂着个大太阳的尴尬情景你经历过吗? 本来想去海边看个日落,结果车到了,太阳也落了的 ...
- 线上故障之-雪花算法重复、序列化、redis锁失效、double精准计算
线上故障之-雪花算法重复.序列化.redis锁失效.double精准计算 雪花算法重复 问题发现 定位 影响范围 解决方案 扩展-雪花算法原理分析: 序列化 运营商 POP 裸机搭售自营套餐事故分析 ...
- bat中使用mshta调用vbs语句获取精准计算的日期
1.在bat中,获取指定的日期格式是比较麻烦的.因为cmd环境中,日期格式随着系统的时间格式设置而变化,通常系统默认的时间格式是"\'"符号作为连接符. 日期通常用在文件名上,比如 ...
- java 精确 计算_java中进行高精度精准计算
今天在做接口传保费的时候出现了一个奇怪的问题,double类型保费变成了一大长串的非精准保费,甚至奇怪,难道是java的bug?最后通过度娘找到了答案 话不多说,先看如下代码public final ...
- Ws91.cn短链接精准计算群发短信营销转化率
营销推广最终都要考核转化情况,群发短信营销也是不例外的.营销短信群发给大量的用户之后,最终会有多少的转化率了,这就需要使用ws91.cn短链接工具了.营销短信内容中添加上经过ws91.cn缩短后的链接 ...
- HTML表格选定区域自动求和,用Jquery选择器计算table中的某一列某一行的合计
利用Jquery选择器,计算table中的某一列,某一行的合计,非常方便.下面以计算行合计为例: 核心算法: $('#tableId tr').each(function() { $(this).fi ...
- jquery实现计算两个日期之间天数
日期选择需要用到jedate日期插件,其api文档请访问jedate日期控件 首先要引入日期控件的相关css文件以及js文件,可以去官网下载下载地址 然后在html里面引入 <link rel= ...
- jQuery 加减乘除计算
本次实现jQuery加减乘除的运算效果 开发工具与关键技术:Visual Studio 2015 JavaScript 当然 首先还是先写出大概样式如下图: 下图便是在页面加载完成的样式: 之后便是添 ...
最新文章
- 在Ubuntu 14.04 64bit上查看硬件配置信息
- 公司新来的阿里p8,看了我做的APP和接口测试,甩给了我这份文档
- html动画效果放大,一个CSS+jQuery实现的放大缩小动画效果
- 域名商2014年度报告:中国数据域名总量跌至22万
- python逐行读取数据时出现错误_python如何逐行读取数据
- bootstrap插件bootbox参数和自定义弹出框宽度设置
- 如何区分真的工厂还是假的工厂
- Solr 4.10.3 集成 IK Analyzer 2012FF 中文分词器
- 华为研发工程师编程题:汽水瓶 [python]
- 迅雷“应版权方要求,文件无法下载”完美解决方法!
- Centos 7 开机提示 Entering emergency mode 解决方法
- maya如何查看资源大纲_怎样才算入门了Maya
- 华盛顿大学华人团队进入微软Imagine Cup总决赛!
- 关于在 firefox 主页自定义背景可以用的图片
- 深度搜索----深度搜索解决数独问题
- win7系统如何映射服务器,映射网络驱动器在Win7系统中的操作方法
- 家里用服务器放在哪个位置,家用路由器放在什么位置比较合理?
- linux离线语音识别程序,linux离线语音识别安装运行总结
- python技巧 黑魔法指南笔记
- 使用C4D灵动诠释宇舶表限量版陀飞轮全蓝宝石腕表的冰肌玉骨
热门文章
- (四)将容器部署到Azure上的Kubernetes
- Python 3.5 正式退役,不再受支持
- 学习3D图形引擎中使用的基本数学
- 选择开源项目什么最重要?许可证排第一
- 10天内构建良好的REST API的指南
- 要求在ASP.NET Core 2.2中确认电子邮件——第2部分
- Odoo10教程---模块化二:模型间关系,继承,计算字段等
- php给客户端发广播,phpsocket.io如何向一个组广播?
- gradle mysql方言_Ktorm | 方言与原生 SQL
- html5语法参考图片,CSS属性参考 | background-image