一、事件发生:在进行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精准计算相关推荐

  1. MES计件工资——实现工资精准计算的重要工具

    计件工资是一种按照工人完成的工作量来计算工资的方式,它与传统的计时工资相比,更能激发员工的生产积极性和工作热情.而MES系统则是一种能够帮助企业实现生产过程管理和控制的软件系统.它可以涵盖生产计划.生 ...

  2. Python 超级简单精准计算地点日出日落时间

    原文来自Python实用宝典:Python 超级简单精准计算地点日出日落时间 本来想浪漫一把去看个日出,过去后看见天上挂着个大太阳的尴尬情景你经历过吗? 本来想去海边看个日落,结果车到了,太阳也落了的 ...

  3. 线上故障之-雪花算法重复、序列化、redis锁失效、double精准计算

    线上故障之-雪花算法重复.序列化.redis锁失效.double精准计算 雪花算法重复 问题发现 定位 影响范围 解决方案 扩展-雪花算法原理分析: 序列化 运营商 POP 裸机搭售自营套餐事故分析 ...

  4. bat中使用mshta调用vbs语句获取精准计算的日期

    1.在bat中,获取指定的日期格式是比较麻烦的.因为cmd环境中,日期格式随着系统的时间格式设置而变化,通常系统默认的时间格式是"\'"符号作为连接符. 日期通常用在文件名上,比如 ...

  5. java 精确 计算_java中进行高精度精准计算

    今天在做接口传保费的时候出现了一个奇怪的问题,double类型保费变成了一大长串的非精准保费,甚至奇怪,难道是java的bug?最后通过度娘找到了答案 话不多说,先看如下代码public final ...

  6. Ws91.cn短链接精准计算群发短信营销转化率

    营销推广最终都要考核转化情况,群发短信营销也是不例外的.营销短信群发给大量的用户之后,最终会有多少的转化率了,这就需要使用ws91.cn短链接工具了.营销短信内容中添加上经过ws91.cn缩短后的链接 ...

  7. HTML表格选定区域自动求和,用Jquery选择器计算table中的某一列某一行的合计

    利用Jquery选择器,计算table中的某一列,某一行的合计,非常方便.下面以计算行合计为例: 核心算法: $('#tableId tr').each(function() { $(this).fi ...

  8. jquery实现计算两个日期之间天数

    日期选择需要用到jedate日期插件,其api文档请访问jedate日期控件 首先要引入日期控件的相关css文件以及js文件,可以去官网下载下载地址 然后在html里面引入 <link rel= ...

  9. jQuery 加减乘除计算

    本次实现jQuery加减乘除的运算效果 开发工具与关键技术:Visual Studio 2015 JavaScript 当然 首先还是先写出大概样式如下图: 下图便是在页面加载完成的样式: 之后便是添 ...

最新文章

  1. 在Ubuntu 14.04 64bit上查看硬件配置信息
  2. 公司新来的阿里p8,看了我做的APP和接口测试,甩给了我这份文档
  3. html动画效果放大,一个CSS+jQuery实现的放大缩小动画效果
  4. 域名商2014年度报告:中国数据域名总量跌至22万
  5. python逐行读取数据时出现错误_python如何逐行读取数据
  6. bootstrap插件bootbox参数和自定义弹出框宽度设置
  7. 如何区分真的工厂还是假的工厂
  8. Solr 4.10.3 集成 IK Analyzer 2012FF 中文分词器
  9. 华为研发工程师编程题:汽水瓶 [python]
  10. 迅雷“应版权方要求,文件无法下载”完美解决方法!
  11. Centos 7 开机提示 Entering emergency mode 解决方法
  12. maya如何查看资源大纲_怎样才算入门了Maya
  13. 华盛顿大学华人团队进入微软Imagine Cup总决赛!
  14. 关于在 firefox 主页自定义背景可以用的图片
  15. 深度搜索----深度搜索解决数独问题
  16. win7系统如何映射服务器,映射网络驱动器在Win7系统中的操作方法
  17. 家里用服务器放在哪个位置,家用路由器放在什么位置比较合理?
  18. linux离线语音识别程序,linux离线语音识别安装运行总结
  19. python技巧 黑魔法指南笔记
  20. 使用C4D灵动诠释宇舶表限量版陀飞轮全蓝宝石腕表的冰肌玉骨

热门文章

  1. (四)将容器部署到Azure上的Kubernetes
  2. Python 3.5 正式退役,不再受支持
  3. 学习3D图形引擎中使用的基本数学
  4. 选择开源项目什么最重要?许可证排第一
  5. 10天内构建良好的REST API的指南
  6. 要求在ASP.NET Core 2.2中确认电子邮件——第2部分
  7. Odoo10教程---模块化二:模型间关系,继承,计算字段等
  8. php给客户端发广播,phpsocket.io如何向一个组广播?
  9. gradle mysql方言_Ktorm | 方言与原生 SQL
  10. html5语法参考图片,CSS属性参考 | background-image