避坑之 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 相关文章推荐
服务器安全设置的几个注册表设置
Jul 28 Javascript
js 获取服务器控件值的代码
Mar 05 Javascript
iframe父页面获取子页面参数的方法
Feb 21 Javascript
javascript模拟枚举的简单实例
Mar 06 Javascript
jQuery实现可以控制图片旋转角度效果(附demo源码下载)
Jan 27 Javascript
Vue.js学习笔记之 helloworld
Aug 14 Javascript
node结合swig渲染摸板的方法
Apr 11 Javascript
Vue前端开发规范整理(推荐)
Apr 23 Javascript
详解微信小程序支付流程与梳理
Jul 16 Javascript
Vue 使用beforeEach实现登录状态检查功能
Oct 31 Javascript
手把手带你搭建一个node cli的方法示例
Aug 07 Javascript
JS实现拖动模糊框特效
Aug 25 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
日本十大惊悚动漫
2020/03/04 日漫
PHP备份数据库生成SQL文件并下载的函数代码
2012/02/05 PHP
PHP 7的一些引人注目的新特性简单介绍
2015/11/08 PHP
如何通过View::first使用Laravel Blade的动态模板详解
2017/09/21 PHP
JavaScript入门教程(7) History历史对象
2009/01/31 Javascript
Js 本页面传值实现代码
2009/05/17 Javascript
javascript对talbe进行动态添加、删除、验证实现代码
2012/03/29 Javascript
window.parent与window.openner区别介绍
2012/04/12 Javascript
JQuery Mobile实现导航栏和页脚
2016/03/09 Javascript
jquery对象访问是什么及使用方法介绍
2016/05/03 Javascript
聊聊那些使用前端Javascript实现的机器学习类库
2017/09/18 Javascript
解析Vue2 dist 目录下各个文件的区别
2017/11/22 Javascript
vue中如何实现pdf文件预览的方法
2018/07/12 Javascript
bootstrap动态调用select下拉框的实例代码
2018/08/09 Javascript
深入理解JS中Number(),parseInt(),parseFloat()三者比较
2018/08/24 Javascript
详解在微信小程序的JS脚本中使用Promise来优化函数处理
2019/03/06 Javascript
vue 使用插槽分发内容操作示例【单个插槽、具名插槽、作用域插槽】
2020/03/06 Javascript
JavaScript中while循环的基础使用教程
2020/08/11 Javascript
Python实现的简单文件传输服务器和客户端
2015/04/08 Python
详解Python中列表和元祖的使用方法
2015/04/25 Python
Python中的with...as用法介绍
2015/05/28 Python
python实现感知器
2017/12/19 Python
python3.6使用pymysql连接Mysql数据库
2018/05/25 Python
python使用paramiko模块通过ssh2协议对交换机进行配置的方法
2019/07/25 Python
Python3爬虫里关于代理的设置总结
2020/07/30 Python
Python xmltodict模块安装及代码实例
2020/10/05 Python
python3.9实现pyinstaller打包python文件成exe
2020/12/13 Python
客户经理岗位职责
2013/12/08 职场文书
文秘个人求职信范文
2014/04/22 职场文书
银行先进个人事迹材料
2014/05/11 职场文书
环保倡议书格式范文
2014/05/14 职场文书
县级文明单位申报材料
2014/05/23 职场文书
2015年卫生局工作总结
2015/07/24 职场文书
年终工作总结范文
2019/06/20 职场文书
《悬崖边的树》读后感2篇
2019/12/02 职场文书
Nginx Rewrite使用场景及配置方法解析
2021/04/01 Servers