避坑之 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类和继承 prototype属性
Sep 03 Javascript
快速查找数组中的某个元素并返回下标示例
Sep 03 Javascript
JS获取计算机mac地址以及IP的实现方法
Jan 08 Javascript
jQuery中empty()方法用法实例
Jan 16 Javascript
javascript实现获取浏览器版本、浏览器类型
Dec 02 Javascript
JavaScript常用代码书写规范的超全面总结
Sep 11 Javascript
Bootstrap滚动监听组件scrollspy.js使用方法详解
Jul 20 Javascript
JS实现的简单折叠展开动画效果示例
Apr 28 Javascript
JavaScript惰性载入函数实例分析
Mar 27 Javascript
Weex开发之地图篇的具体使用
Oct 16 Javascript
基于vue3.0.1beta搭建仿京东的电商H5项目
May 06 Javascript
Vue 构造选项 - 进阶使用说明
Aug 14 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自定义函数call_user_func和call_user_func_array详解
2011/07/14 PHP
PHP的Yii框架使用中的一些错误解决方法与建议
2015/08/21 PHP
Yii框架上传图片用法总结
2016/03/28 PHP
Laravel框架中队列和工作(Queues、Jobs)操作实例详解
2020/04/06 PHP
jquery中eq和get的区别与使用方法
2011/04/14 Javascript
分享10篇优秀的jQuery幻灯片制作教程及应用案例
2011/04/16 Javascript
js 阻止子元素响应父元素的onmouseout事件具体实现
2013/12/23 Javascript
js 判断控件获得焦点的示例代码
2014/03/04 Javascript
javascript中Array数组的迭代方法实例分析
2015/02/04 Javascript
js中javascript:void(0) 真正含义
2020/11/05 Javascript
JavaScript隐式类型转换
2016/03/15 Javascript
在ABP框架中使用BootstrapTable组件的方法
2017/07/31 Javascript
详解webpack babel的配置
2018/01/09 Javascript
使用vux实现上拉刷新功能遇到的坑
2018/02/08 Javascript
Vue2.0 实现歌手列表滚动及右侧快速入口功能
2018/08/08 Javascript
解决layui 复选框等内置控件不显示的问题
2018/08/14 Javascript
微信小程序支付PHP代码
2018/08/23 Javascript
JavaScript中的回调函数实例讲解
2019/01/27 Javascript
[03:56]还原FTP电影首映式 DOTA2群星拼出遗迹世界
2014/03/26 DOTA
[04:10]2016国际邀请赛中国区预选赛第二日TOP10精彩集锦
2016/06/28 DOTA
[01:47]2018年度DOTA2最具人气解说-完美盛典
2018/12/16 DOTA
简单解析Django框架中的表单验证
2015/07/17 Python
Django实现文件上传和下载功能
2019/10/06 Python
pyinstaller将含有多个py文件的python程序做成exe
2020/04/29 Python
香港迪士尼乐园酒店预订:Hong Kong Disneyland Hotels
2017/05/02 全球购物
面试后的感谢信范文
2014/02/01 职场文书
保卫科工作岗位职责
2014/03/01 职场文书
对祖国的寄语大全
2014/04/11 职场文书
青春励志演讲稿
2014/04/29 职场文书
财务会计专业求职信
2014/06/09 职场文书
出纳工作检讨书
2014/10/18 职场文书
2015年个人工作总结报告
2015/04/25 职场文书
Vue如何实现组件间通信
2021/05/15 Vue.js
详细了解MVC+proxy
2021/07/09 Java/Android
Django对接elasticsearch实现全文检索的示例代码
2021/08/02 Python
Pygame Rect区域位置的使用(图文)
2021/11/17 Python