避坑之 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 相关文章推荐
IE图片缓存document.execCommand("BackgroundImageCache",false,true)
Mar 01 Javascript
javascript学习笔记(二)数组和对象部分
Sep 30 Javascript
JavaScript中Function()函数的使用教程
Jun 04 Javascript
JavaScript对HTML DOM使用EventListener进行操作
Oct 21 Javascript
JS获取checkbox的个数简单实例
Aug 19 Javascript
JS实现的驼峰式和连字符式转换功能分析
Dec 21 Javascript
很棒的vue弹窗组件
May 24 Javascript
jQuery结合jQuery.cookie.js插件实现换肤功能示例
Oct 14 jQuery
React优化子组件render的使用
May 12 Javascript
微信接入之获取用户头像的方法步骤
Sep 23 Javascript
如何解决jQuery 和其他JS库的冲突
Jun 22 jQuery
vue中div禁止点击事件的实现
Apr 02 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的access操作类
2008/04/09 PHP
PHP中使用crypt()实现用户身份验证的代码
2012/09/05 PHP
php多个字符串替换成同一个的解决方法
2013/06/18 PHP
php计算程序运行时间的简单例子分享
2014/05/10 PHP
PHP中执行cmd命令的方法
2014/10/11 PHP
PHP+Ajax无刷新带进度条图片上传示例
2017/02/08 PHP
Yii2.0框架实现带分页的多条件搜索功能示例
2019/02/20 PHP
JavaScript是否可实现多线程  深入理解JavaScript定时机制
2009/12/22 Javascript
Jquery AutoComplete自动完成 的使用方法实例
2010/03/19 Javascript
动态创建样式表在各浏览器中的差异测试代码
2011/09/13 Javascript
jquery不会自动回收xmlHttpRequest对象 导致了内存溢出
2012/06/18 Javascript
jQuery中addClass()方法用法实例
2015/01/05 Javascript
Javascript核心读书有感之语言核心
2015/02/01 Javascript
jQuery根据元素值删除数组元素的方法
2015/06/24 Javascript
引用jquery框架后出错的解决方法
2016/08/09 Javascript
js 实现获取name 相同的页面元素并循环遍历的方法
2017/02/14 Javascript
JS+HTML5实现图片在线预览功能
2017/07/22 Javascript
javascript兼容性(实例讲解)
2017/08/15 Javascript
微信小程序之自定义组件的实现代码(附源码)
2018/08/02 Javascript
vue基础之v-bind属性、class和style用法分析
2019/03/11 Javascript
使用原生JS实现火锅点餐小程序(面向对象思想)
2019/12/10 Javascript
使用Python中的cookielib模拟登录网站
2015/04/09 Python
python爬虫框架scrapy实战之爬取京东商城进阶篇
2017/04/24 Python
python用for循环求和的方法总结
2019/07/08 Python
python实现企业微信定时发送文本消息的示例代码
2020/11/24 Python
为有想象力的人提供的生活方式商店:Firebox
2018/06/04 全球购物
教你怎样写好自我评价
2013/10/05 职场文书
高中生毕业学习总结的自我评价
2013/11/14 职场文书
青年志愿者先进事迹
2014/05/06 职场文书
大学生撤销处分思想汇报
2014/09/12 职场文书
2014年学前班工作总结
2014/12/08 职场文书
小学班主任研修日志
2015/11/13 职场文书
Redis Cluster 集群搭建你会吗
2021/08/04 Redis
uni-app 微信小程序授权登录的实现步骤
2022/02/18 Javascript
Java实现学生管理系统(IO版)
2022/02/24 Java/Android
MySQL中LAG()函数和LEAD()函数的使用
2022/08/14 MySQL