避坑之 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 相关文章推荐
23个Javascript弹出窗口特效整理
Feb 25 Javascript
node.js中的querystring.escape方法使用说明
Dec 10 Javascript
JQuery控制Radio选中方法分析
May 29 Javascript
Javascript实现div层渐隐效果的方法
May 30 Javascript
41个Web开发者必须收藏的JavaScript实用技巧
Jul 22 Javascript
jQuery实现的自定义滚动条实例详解
Sep 20 Javascript
纯javascript版日历控件
Nov 24 Javascript
jquery实现百叶窗效果
Jan 12 Javascript
jQuery模拟淘宝购物车功能
Feb 27 Javascript
B/S(Web)实时通讯解决方案分享
Apr 06 Javascript
对vuejs的v-for遍历、v-bind动态改变值、v-if进行判断的实例讲解
Aug 27 Javascript
小程序如何定位所在城市及发起周边搜索
Feb 11 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
准确获得页面、窗口高度及宽度的JS
2006/11/26 Javascript
pjblog修改技巧汇总
2007/03/12 Javascript
jQuery帮助之筛选查找 children([expr])
2011/01/31 Javascript
用按钮控制iframe显示的网页实现方法
2013/02/04 Javascript
复制js对象方法(详解)
2013/07/08 Javascript
jQuery实现类似滑动门切换效果的层切换
2013/09/23 Javascript
14款经典网页图片和文字特效的jQuery插件-前端开发必备
2015/08/25 Javascript
Vue.js自定义指令的用法与实例解析
2017/01/18 Javascript
Vue组件之全局组件与局部组件的使用详解
2017/10/09 Javascript
mui框架移动开发初体验详解
2017/10/11 Javascript
js操作二进制数据方法
2018/03/03 Javascript
微信小程序API—获取定位的详解
2019/04/30 Javascript
关于vue3默认把所有onSomething当作v-on事件绑定的思考
2020/05/15 Javascript
[10:34]DOTA2上海特级锦标赛全纪录
2016/03/25 DOTA
python搭建简易服务器分析与实现
2012/12/15 Python
解决Python出现_warn_unsafe_extraction问题的方法
2016/03/24 Python
PyCharm在win10的64位系统安装实例
2017/11/26 Python
python numpy和list查询其中某个数的个数及定位方法
2018/06/27 Python
在IPython中进行Python程序执行时间的测量方法
2018/11/01 Python
对Python中list的倒序索引和切片实例讲解
2018/11/15 Python
基于python修改srt字幕的时间轴
2020/02/03 Python
在 Python 中接管键盘中断信号的实现方法
2020/02/04 Python
python利用opencv实现SIFT特征提取与匹配
2020/03/05 Python
python matplotlib实现将图例放在图外
2020/04/17 Python
css 元素选择器的简单实例
2016/05/23 HTML / CSS
阿迪达斯芬兰官方网站:adidas芬兰
2017/01/30 全球购物
美国最大的电子宠物训练产品制造商:PetSafe
2018/10/12 全球购物
Hotels.com泰国:酒店预订网站
2019/11/20 全球购物
《陈毅探母》教学反思
2014/05/01 职场文书
护士求职信
2014/07/05 职场文书
名人演讲稿范文
2014/09/16 职场文书
维稳工作情况汇报
2014/10/27 职场文书
赵氏孤儿观后感
2015/06/09 职场文书
学校扫黄打非工作总结
2015/10/15 职场文书
担保书范文
2019/07/09 职场文书
Python基础之函数嵌套知识总结
2021/05/23 Python