避坑之 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中遭遇级联表达式陷阱
Mar 08 Javascript
如何简单地用YUI做JavaScript动画
Mar 10 Javascript
JSONP 跨域共享信息
Aug 16 Javascript
基于javascript实现图片左右切换效果
Jan 25 Javascript
简单了解Backbone.js的Model模型以及View视图的源码
Feb 14 Javascript
JS中实现函数return多个返回值的实例
Feb 21 Javascript
使用3D引擎threeJS实现星空粒子移动效果
Sep 13 Javascript
javascript连接mysql与php通过odbc连接任意数据库的实例
Dec 27 Javascript
以v-model与promise两种方式实现vue弹窗组件
May 21 Javascript
Vue中$refs的用法详解
Jun 24 Javascript
vue-image-crop基于Vue的移动端图片裁剪组件示例
Aug 28 Javascript
vue工程全局设置ajax的等待动效的方法
Feb 22 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
Yii使用DeleteAll连表删除出现报错问题的解决方法
2016/07/14 PHP
PHP中通过getopt解析GNU C风格命令行选项
2019/11/18 PHP
js弹出框轻量级插件jquery.boxy使用介绍
2013/01/15 Javascript
JavaScript中奇葩的假值示例应用
2014/03/11 Javascript
通过JS判断联网类型和连接状态的实现代码
2015/04/01 Javascript
JavaScript类型系统之基本数据类型与包装类型
2016/01/06 Javascript
js实现图片缓慢放大缩小效果
2016/08/02 Javascript
jquery结合html实现中英文页面切换
2016/11/29 Javascript
利用Plupload.js解决大文件上传问题, 带进度条和背景遮罩层
2017/03/15 Javascript
Vue2.0利用vue-resource上传文件到七牛的实例代码
2017/07/28 Javascript
浅谈Express异步进化史
2017/09/09 Javascript
微信小程序checkbox组件使用详解
2018/01/31 Javascript
node前端开发模板引擎Jade的入门
2018/05/11 Javascript
微信小程序左滑动显示菜单功能的实现
2018/06/14 Javascript
JS中使用cavas截图网页并解决跨域及模糊问题
2018/11/13 Javascript
JS+DIV实现拖动效果
2020/02/11 Javascript
[04:49]2014DOTA2国际邀请赛 Newbee顺利挺进总决赛 ImbaTV独家专访
2014/07/19 DOTA
Python实现数据可视化看如何监控你的爬虫状态【推荐】
2018/08/10 Python
python可视化爬虫界面之天气查询
2019/07/03 Python
python中class的定义及使用教程
2019/09/18 Python
python读取与处理netcdf数据方式
2020/02/14 Python
python安装dlib库报错问题及解决方法
2020/03/16 Python
Python响应对象text属性乱码解决方案
2020/03/31 Python
jupyter notebook 恢复误删单元格或者历史代码的实现
2020/04/17 Python
读取nii或nii.gz文件中的信息即输出图像操作
2020/07/01 Python
Python使用socket模块实现简单tcp通信
2020/08/18 Python
前后端结合实现amazeUI分页效果
2020/08/21 HTML / CSS
法国珠宝店:CLEOR
2017/01/29 全球购物
儿科护士自我鉴定
2013/10/14 职场文书
自我推荐书
2013/12/04 职场文书
小学毕业演讲稿
2014/04/25 职场文书
烹饪大赛策划方案
2014/05/26 职场文书
2015年度校学生会工作总结报告
2015/05/23 职场文书
python百行代码实现汉服圈图片爬取
2021/11/23 Python
Django+Nginx+uWSGI 定时任务的实现方法
2022/01/22 Python
sqlserver连接错误之SQL评估期已过的问题解决
2022/03/23 SQL Server