避坑之 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 中document.URL 和 windows.location.href 的区别
Nov 11 Javascript
JavaScript Event学习第十章 一些可替换的事件对
Feb 10 Javascript
远离JS灾难css灾难之 js私有函数和css选择器作为容器
Dec 11 Javascript
jquery submit ie6下失效的原因分析及解决方法
Nov 15 Javascript
ECMAScript6的新特性箭头函数(Arrow Function)详细介绍
Jun 07 Javascript
JS的数组迭代方法
Feb 05 Javascript
JavaScript创建闭包的两种方式的优劣与区别分析
Jun 22 Javascript
探讨Vue.js的组件和模板
Oct 27 Javascript
JS实现倒计时图文效果
Nov 17 Javascript
vue-cli3 DllPlugin 提取公用库的方法
Apr 24 Javascript
react实现antd线上主题动态切换功能
Aug 12 Javascript
vue使用vue-quill-editor富文本编辑器且将图片上传到服务器的功能
Jan 13 Vue.js
原生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强制下载类型的实现代码
2011/04/21 PHP
遭遇php的in_array低性能问题
2013/09/17 PHP
自动生成文章摘要的代码[JavaScript 版本]
2007/03/20 Javascript
取得窗口大小 兼容所有浏览器的js代码
2011/08/09 Javascript
vue loadmore 组件滑动加载更多源码解析
2017/07/19 Javascript
javascript+html5+css3自定义弹出窗口效果
2017/10/26 Javascript
PHP自动加载autoload和命名空间的应用小结
2017/12/01 Javascript
js统计页面上每个标签的数量实例代码
2018/05/29 Javascript
详解如何在vue-cli中使用vuex
2018/08/07 Javascript
移动端H5页面返回并刷新页面(BFcache)的方法
2018/11/06 Javascript
微信小程序实现录音功能
2019/11/22 Javascript
es6函数之严格模式用法实例分析
2020/03/17 Javascript
Python自动化构建工具scons使用入门笔记
2015/03/10 Python
Python基础篇之初识Python必看攻略
2016/06/23 Python
Python 解决中文写入Excel时抛异常的问题
2018/05/03 Python
Python中实例化class的执行顺序示例详解
2018/10/14 Python
利用python GDAL库读写geotiff格式的遥感影像方法
2018/11/29 Python
用Python将结果保存为xlsx的方法
2019/01/28 Python
在Django admin中编辑ManyToManyField的实现方法
2019/08/09 Python
tensorflow实现训练变量checkpoint的保存与读取
2020/02/10 Python
The North Face北面英国官网:美国著名户外品牌
2017/12/13 全球购物
阿联酋航空假期:Emirates Holidays
2018/03/20 全球购物
香港连卡佛百货官网:Lane Crawford
2019/09/04 全球购物
西雅图的买手店:Totokaelo
2019/10/19 全球购物
加拿大鞋网:Globo Shoes
2019/12/26 全球购物
JSF面试题:如何管量web层中的Bean,用什么标签。如何通过jsp页面与Bean绑定在一起进行处理?
2012/10/05 面试题
字符串str除首尾字符外的其他字符按升序排列
2013/03/08 面试题
大学生实习自我鉴定
2013/12/11 职场文书
网上快餐厅创业计划书
2014/02/01 职场文书
四风存在的原因分析
2014/02/11 职场文书
竞选演讲稿范文大全
2014/05/12 职场文书
建国大业观后感600字
2015/06/01 职场文书
2017年寒假社区服务活动总结
2016/04/06 职场文书
2019优秀干部竞聘演讲稿范文!
2019/07/02 职场文书
22句经典语录:送给优柔寡断和胡思乱想的朋友们
2019/12/13 职场文书
MySQL系列之开篇 MySQL关系型数据库基础概念
2021/07/02 MySQL