避坑之 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中的对象化编程
Jan 16 Javascript
显示js对象所有属性和方法的函数
Oct 16 Javascript
js调用css属性写法
Sep 21 Javascript
javascript 模拟坦克大战游戏(html5版)附源码下载
Apr 08 Javascript
动态加载iframe时get请求传递中文参数乱码解决方法
May 07 Javascript
jQuery代码性能优化的10种方法
Jun 21 Javascript
AngularJS标签页tab选项卡切换功能经典实例详解
May 16 Javascript
JS散列表碰撞处理、开链法、HashTable散列示例
Feb 08 Javascript
详解基于iview-ui的导航栏路径(面包屑)配置
Feb 22 Javascript
详解Webpack如何引入CDN链接来优化编译后的体积
Jun 21 Javascript
layui加载数据显示loading加载完成loading消失的实例代码
Sep 23 Javascript
layui实现二维码弹窗、并下载到本地的方法
Sep 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
PHP中对用户身份认证实现两种方法
2011/06/04 PHP
php命令行使用方法和命令行参数说明
2014/04/08 PHP
php实现zip压缩文件解压缩代码分享(简单易懂)
2014/05/10 PHP
php读取csv数据保存到数组的方法
2015/01/03 PHP
php自定义urlencode,urldecode函数实例
2015/03/24 PHP
typecho插件编写教程(五):核心代码
2015/05/28 PHP
PHP实现微信发红包程序
2015/08/24 PHP
使用PHP+Redis实现延迟任务,实现自动取消订单功能
2019/11/21 PHP
jquery中防刷IP流量软件影响统计的一点对策
2011/07/10 Javascript
关于jQuery参考实例2.0 用jQuery选择元素
2013/04/07 Javascript
Angular2 (RC5) 路由与导航详解
2016/09/21 Javascript
AngularJS中的缓存使用
2017/01/11 Javascript
js es6系列教程 - 基于new.target属性与es5改造es6的类语法
2017/09/02 Javascript
JavaScript闭包原理与用法实例分析
2018/08/10 Javascript
大转盘抽奖小程序版 转盘抽奖网页版
2020/04/16 Javascript
Angular实现svg和png图片下载实现
2019/05/05 Javascript
Vue 实现输入框新增搜索历史记录功能
2019/10/15 Javascript
手把手教您实现react异步加载高阶组件
2020/04/07 Javascript
基于脚手架创建Vue项目实现步骤详解
2020/08/03 Javascript
JavaScript中的执行环境和作用域链
2020/09/04 Javascript
JS canvas实现画板和签字板功能
2021/02/23 Javascript
python3.6下Numpy库下载与安装图文教程
2019/04/02 Python
python numpy存取文件的方式
2020/04/01 Python
一款纯css3实现的动画加载导航
2014/10/08 HTML / CSS
中东地区为妈妈们提供一切的头号购物目的地:Sprii
2018/05/06 全球购物
Gucci法国官方网站:意大利奢侈品牌
2018/07/25 全球购物
如何用SQL语句进行模糊查找
2015/09/25 面试题
Ajax主要包含了哪些技术
2014/06/12 面试题
党校学习心得体会范文
2014/09/09 职场文书
详细的本科生职业生涯规划范文
2014/09/16 职场文书
大学生个人总结范文
2015/02/15 职场文书
郭明义电影观后感
2015/06/08 职场文书
仓库管理制度范本
2015/08/04 职场文书
详解CSS故障艺术
2021/05/25 HTML / CSS
Python中OpenCV实现查找轮廓的实例
2021/06/08 Python
python的变量和简单数字类型详解
2021/09/15 Python