避坑之 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实例教程(19) 使用HoTMetal(2)
Dec 23 Javascript
IE Firefox 使用自定义标签的区别
Oct 15 Javascript
js 刷新页面的代码小结 推荐
Apr 02 Javascript
js给onclick事件赋值,动态传参数实例解说
Mar 28 Javascript
AngularJS初始化过程分析(引导程序)
Dec 06 Javascript
浅谈JavaScript异常处理语句
Jun 26 Javascript
Web开发必知Javascript技巧大全
Feb 23 Javascript
JavaScript中实现键值对应的字典与哈希表结构的示例
Jun 12 Javascript
JS实现隐藏同级元素后只显示JS文件内容的方法
Sep 04 Javascript
vue与bootstrap实现时间选择器的示例代码
Aug 26 Javascript
使用jQuery如何写一个含验证码的登录界面
May 13 jQuery
JavaScript array常用方法代码实例详解
Sep 02 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 xml-rpc远程调用
2008/12/19 PHP
PHP中设置一个严格30分钟过期Session面试题的4种答案
2014/07/30 PHP
Zend Framework数据库操作方法实例总结
2016/12/11 PHP
php防止sql注入的方法详解
2017/02/20 PHP
弹出模态框modal的实现方法及实例
2017/09/19 PHP
PHP中有关长整数的一些操作教程
2019/09/11 PHP
网页设计常用的一些技巧
2006/12/22 Javascript
List Information About the Binary Files Used by an Application
2007/06/18 Javascript
jQuery EasyUI API 中文文档 - TimeSpinner时间微调器
2011/10/23 Javascript
jquery实现点击弹出层效果的简单实例
2014/03/03 Javascript
Javascript之String对象详解
2016/06/08 Javascript
jQuery实现查找链接文字替换属性的方法
2016/06/27 Javascript
Vue2.0利用 v-model 实现组件props双向绑定的优美解决方案
2017/03/13 Javascript
基于Vue的文字跑马灯组件(npm 组件包)
2017/05/24 Javascript
在Vue环境下利用worker运行interval计时器的步骤
2019/08/01 Javascript
layui点击按钮页面会自动刷新的解决方案
2019/10/25 Javascript
JavaScript简单编程实例学习
2020/02/14 Javascript
Vue项目接入Paypal实现示例详解
2020/06/04 Javascript
javascript实现前端成语点击验证优化
2020/06/24 Javascript
echarts柱状图背景重叠组合而非并列的实现代码
2020/12/10 Javascript
[05:04]DOTA2上海特级锦标赛主赛事第二日TOP10
2016/03/04 DOTA
Python中的引用和拷贝浅析
2014/11/22 Python
Python pymongo模块常用操作分析
2018/09/01 Python
Python对ElasticSearch获取数据及操作
2019/04/24 Python
django实现支付宝支付实例讲解
2019/10/17 Python
Python无损压缩图片的示例代码
2020/08/06 Python
Pycharm中如何关掉python console
2020/10/27 Python
关于 HTML5 的七个传说小结
2012/04/12 HTML / CSS
泰国办公用品购物网站:OfficeMate
2018/02/04 全球购物
中班中秋节活动反思
2014/02/18 职场文书
工程项目经理任命书
2014/06/05 职场文书
普通党员个人整改措施
2014/10/27 职场文书
逃课检讨书范文
2015/05/06 职场文书
教师师德工作总结2015
2015/07/22 职场文书
2016春季运动会开幕词
2016/03/04 职场文书
基于Python编写一个监控CPU的应用系统
2022/06/25 Python