需求: 对浮点数进行四舍五入精度获取.
问题: 直接使用 Number.toFixed() 会出现异常的舍入情况.
原因: 计算机浮点数存储是二进制, JS 的 Number.toFixed() 实际的精度确认规则是四舍六入五成双, 逢四下舍, 逢六入一, 逢五时, 根据浏览器内核计算结果也不尽相同.
具体原理这里不做详细描述, 各位看官可自行查阅相关资料.
解决方法: 重新 Number.toFixed() 方法.
实现原理: 将浮点数转化为整数, 保留所需位数, 再转为浮点数.
实现代码:
- Number.prototype.toFixed = function (length) {
- var s = this + '';
- var len = length || 0;
- var result = s;
- var arr = s.split('.');
- // 整数
- if (arr.length <2) {// 前端全栈交流学习圈: 866109386
- if (len> 0) { // 面向 1-3 年经验的前端开发人员
- result += '.';// 帮助突破技术瓶颈, 提升思维能力
- for (var i = 1; i <= len; i++) {
- result += '0';
- }
- }
- return result;
- }
- // 小数
- var first = arr[0];
- var second = arr[1];
- // 小数点位数等于 length
- if (second.length == len) {
- return result;
- }
- // 小数点位数小于 length
- if (second.length < len) {
- for (var k = 1; k <= len - second.length; k++) {
- result += '0';
- }
- return result;
- }
- // 小数点位数大于 length
- result = first + second.substr(0, len + 1);
- var last = Math.floor((result * 1 + 5) / 10);
- result = (last / Math.pow(10, len)).toFixed(len);
- return result;
- };
备注: 解决方案有很多种, 这只是个人的理解, 仅供参考.
来源: http://www.qdfuns.com/article/51070/d126b05d69e0cf61ee227f22a8618781.html