避坑之 JavaScript 中的toFixed()和正则表达式


Posted in Javascript onApril 19, 2022

toFixed精度问题

toFixed方法可以把Number四舍五入为指定小数位数的数字。可是大家看下下面这张图,发现了什么?

避坑之 JavaScript 中的toFixed()和正则表达式

0.985四舍五入之后变成了0.98!!

  • 这就是toFixed方法的坑。

导致原因

那这到底是怎么回事呢?本质其实是因为js小数的精度问题。 在计算机中计算,是将数字转成二进制,进行计算之后再转化为十进制。 比如将0.985转化为二进制是0.1111110000101000(超出精度,结果保留了16位小数),此时再将该二进制转化为十进制结果为:0.9849853515625,此时将他保留两位小数就成了0.98

解决办法

  • 那么要如何避免这种问题呢?可以用下面的方法来补充原生的toFixed方法
toFixed(number, precision) {
    var str = number + "";
    var len = str.length;
    var last = str.substring(len - 1, len);
    var afterPoint = str.substring(str.indexOf(".") + 1, len);
    if (last == "5" && afterPoint.length > precision) {
        last = "6";
        str = str.substring(0, len - 1) + last;
        return (str - 0).toFixed(precision);
    } else {
        return number.toFixed(precision);
    }
},

正则表达式全局匹配的坑

有这么一个需求,select支持可以搜索item。刚看到我就兴致冲冲去写了,这还不简单吗,输入的数据和select中的数据源进行正则匹配,匹配到的就是搜索到的。

过滤函数我是这么写的:

//searchKey是输入的数据
const regex = new RegExp(searchKey.trim(), 'gi');
let dataSource = [
    {
        value: 'test1',
    },

    {
        value: 'test2',
    },
];
let res = dataSource
    .map((i) => {
            let _flag = regex.test(i.value);
            i.visible = _flag;
            return i;
    })
    .filter((i) => i.visible);

但是实际运行时,发现数据源中的数据,有的可以匹配到有的匹配不到。当时就纳闷了,这有什么问题吗?最后几经查找答案,原来是正则表达式的全局匹配有个坑:正则表达式中有一个lastIndex的属性,这个属性表示上一次匹配文本结果之后的第一个字符的位置。他在下一次查找的时候,会从lastIndex往后继续查找,这就会导致一下个匹配返回false。

那么如何解决呢?

因为lastIndex属性是可读可写的,所以我这里的解决办法是每次test方法之后将将lastIndex置为零,这样每次匹配都将会从最开始进行查找。这样就会避免这个问题了哦!

let _flag = regex.test(i.value);
regex.lastIndex = 0;

到此这篇关于jJavaScript中toFixed()和正则表达式的坑的文章就介绍到这了!

Javascript 相关文章推荐
JS模块与命名空间的介绍
Mar 22 Javascript
jQuery之尺寸调整组件的深入解析
Jun 19 Javascript
JavaScript中连接操作Oracle数据库实例
Apr 02 Javascript
jQuery中extend函数详解
Jul 13 Javascript
javascript时间排序算法实现活动秒杀倒计时效果
Jan 28 Javascript
javascript基础知识
Jun 07 Javascript
15位和18位身份证JS校验的简单实例
Jul 18 Javascript
ES6中的数组扩展方法
Aug 26 Javascript
AngularJS使用拦截器实现的loading功能完整实例
May 17 Javascript
详解如何在vue中使用sass
Jun 21 Javascript
详解Vue如何支持JSX语法
Nov 10 Javascript
JavaScript常用事件介绍
Jan 21 Javascript
原生JS实现分页
Apr 19 #Javascript
Javascript webpack动态import
微信小程序APP页面的之间的相互传递参数以及自定义组件
微信小程序APP的事件绑定以及传递参数时的冒泡和捕获
微信小程序APP的生命周期及页面的生命周期
解决vue中provide inject的响应式监听
Apr 19 #Vue.js
vue3种table表格选项个数的控制方法
Apr 14 #Vue.js
You might like
PHP中fwrite与file_put_contents性能测试代码
2013/08/02 PHP
windows7下安装php的php-ssh2扩展教程
2014/07/04 PHP
PHP中echo和print的区别
2014/08/28 PHP
PHP is_array() 检测变量是否是数组的实现方法
2016/06/13 PHP
iis 7下安装laravel 5.4环境的方法教程
2017/06/14 PHP
javascript mouseover、mouseout停止事件冒泡的解决方案
2009/04/07 Javascript
node.js中的fs.readFile方法使用说明
2014/12/15 Javascript
Javascript 实现图片无缝滚动
2014/12/19 Javascript
深入理解JavaScript系列(42):设计模式之原型模式详解
2015/03/04 Javascript
JS解析XML文件和XML字符串详解
2015/04/17 Javascript
jQuery插件Validation快速完成表单验证的方式
2016/07/28 Javascript
node.js中express中间件body-parser的介绍与用法详解
2017/05/23 Javascript
vue实现简单的MVVM框架
2018/08/05 Javascript
JavaScript模板引擎实现原理实例详解
2018/12/14 Javascript
js实现圆形显示鼠标单击位置
2020/02/11 Javascript
javascript实现获取中文汉字拼音首字母
2020/05/19 Javascript
Python正则表达式的使用范例详解
2014/08/08 Python
python采用getopt解析命令行输入参数实例
2014/09/30 Python
使用Python的web.py框架实现类似Django的ORM查询的教程
2015/05/02 Python
Python中使用platform模块获取系统信息的用法教程
2016/07/08 Python
对python中GUI,Label和Button的实例详解
2019/06/27 Python
Django 创建/删除用户的示例代码
2019/07/24 Python
python 五子棋如何获得鼠标点击坐标
2019/11/04 Python
python 基于dlib库的人脸检测的实现
2019/11/08 Python
python爬虫模拟浏览器的两种方法实例分析
2019/12/09 Python
css3高级选择器使用方法
2013/12/02 HTML / CSS
Sephora丝芙兰澳洲官方网站:国际知名化妆品购物
2016/10/27 全球购物
英国最大的体育&时尚零售公司:JD Sports
2017/12/13 全球购物
Peter Millar官网:美国高档生活服饰品牌
2018/07/02 全球购物
.net软件工程师面试题
2015/03/31 面试题
公司司机岗位职责范本
2014/03/03 职场文书
诚实守信道德模范事迹材料
2014/08/15 职场文书
2015年七一建党节演讲稿
2015/03/19 职场文书
2015年干部教育培训工作总结
2015/05/15 职场文书
2015年暑期社会实践报告
2015/07/13 职场文书
课题研究阶段性总结
2015/08/13 职场文书