避坑之 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 相关文章推荐
用javascript实现画板的代码
Sep 05 Javascript
zeroclipboard复制到剪切板的flash
Aug 04 Javascript
Jquery插件分享之气泡形提示控件grumble.js
May 20 Javascript
Javascript中arguments对象详解
Oct 22 Javascript
JavaScript模拟实现继承的方法
Mar 30 Javascript
使用jQuery中的wrap()函数操作HTML元素的教程
May 24 Javascript
Node.js Streams文件读写操作详解
Jul 04 Javascript
js监听input输入框值的实时变化实例
Jan 26 Javascript
微信小程序 点击控件后选中其它反选实例详解
Feb 21 Javascript
js实现数组和对象的深浅拷贝
Sep 30 Javascript
javascript头像上传代码实例
Sep 28 Javascript
WEB前端性能优化的7大手段详解
Feb 04 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使用数组依次替换字符串中匹配项
2016/01/08 PHP
PHP 实现重载
2021/03/09 PHP
翻译整理的jQuery使用查询手册
2007/03/07 Javascript
javascript改变position值实现菜单滚动至顶部后固定
2013/01/18 Javascript
比较不错的JS/JQuery显示或隐藏文本的方法
2014/02/13 Javascript
用jquery的方法制作一个简单的导航栏
2014/06/23 Javascript
window.location.reload 刷新使用分析(去对话框)
2015/11/11 Javascript
jqueryMobile使用示例分享
2016/01/12 Javascript
JS实现输入框提示文字点击时消失效果
2016/07/19 Javascript
Google 地图类型详解及示例代码
2016/08/06 Javascript
JS与jQuery实现子窗口获取父窗口元素值的方法
2017/04/17 jQuery
Bootstrap响应式表格详解
2017/05/23 Javascript
微信小程序 自定义Toast实例代码
2017/06/12 Javascript
详解vuejs2.0 select 动态绑定下拉框支持多选
2019/04/25 Javascript
[02:09:59]火猫TV国士无双dota2 6.82版本详解(下)
2014/09/29 DOTA
玩转python selenium鼠标键盘操作(ActionChains)
2020/04/12 Python
python实现两个文件合并功能
2018/04/01 Python
对Python中type打开文件的方式介绍
2018/04/28 Python
利用django-suit模板添加自定义的菜单、页面及设置访问权限
2018/07/13 Python
利用Python如何实现一个小说网站雏形
2018/11/23 Python
python学生管理系统开发
2019/01/30 Python
Python shutil模块用法实例分析
2019/10/02 Python
解决springboot yml配置 logging.level 报错问题
2020/02/21 Python
Centos7下源码安装Python3 及shell 脚本自动安装Python3的教程
2020/03/07 Python
CSS3 :nth-child()伪类选择器实现奇偶行显示不同样式
2013/11/05 HTML / CSS
浅谈CSS3中的变形功能-transform功能
2017/12/27 HTML / CSS
使用HTML5 Canvas绘制圆角矩形及相关的一些应用举例
2016/03/22 HTML / CSS
《蓝色的树叶》教学反思
2014/02/24 职场文书
中华美德颂演讲稿
2014/05/20 职场文书
十周年庆典策划方案
2014/06/03 职场文书
交通工程专业推荐信
2014/09/06 职场文书
2014镇副书记群众路线专题民主生活会思想汇报
2014/09/23 职场文书
买卖合同协议书范本
2014/10/18 职场文书
临床医学生职业规划书范文
2014/10/25 职场文书
Python基础之常用库常用方法整理
2021/04/30 Python
SQL实现LeetCode(197.上升温度)
2021/08/07 MySQL