避坑之 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 相关文章推荐
获取HTML DOM节点元素的方法的总结
Aug 21 Javascript
两种WEB下的模态对话框 (asp.net或js的分别实现)
Dec 02 Javascript
JS继承--原型链继承和类式继承
Apr 08 Javascript
使用CSS和jQuery模拟select并附提交后取得数据的代码
Oct 18 Javascript
jquery实现的伪分页效果代码
Oct 29 Javascript
Bootstrap菜单按钮及导航实例解析
Sep 09 Javascript
JavaScript中全选、全不选、反选、无刷新删除、批量删除、即点即改入库(在yii框架中操作)的代码分享
Nov 01 Javascript
jQuery插件FusionWidgets实现的Cylinder图效果示例【附demo源码】
Mar 23 jQuery
Vue Echarts实现可视化世界地图代码实例
May 07 Javascript
前端Electron新手入门教程详解
Jun 21 Javascript
jsonp格式前端发送和后台接受写法的代码详解
Nov 07 Javascript
如何将Node.js中的回调转换为Promise
Nov 10 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
windows下PHP APACHE MYSQ完整配置
2007/01/02 PHP
php park、unpark、ord 函数使用方法(二进制流接口应用实例)
2010/10/19 PHP
ThinkPHP3.0略缩图不能保存到子目录的解决方法
2012/09/30 PHP
php对mongodb的扩展(初出茅庐)
2012/11/11 PHP
PHP flush()与ob_flush()的区别详解
2013/06/03 PHP
WordPress中登陆后关闭登陆页面及设置用户不可见栏目
2015/12/31 PHP
PHP session垃圾回收机制实例分析
2019/06/28 PHP
一个背景云变换js特效 鼠标移动背景云变化
2012/12/28 Javascript
Javascript正则控制文本框只能输入整数或浮点数
2014/09/02 Javascript
JS中解决谷歌浏览器记住密码输入框颜色改变功能
2017/02/13 Javascript
详解Vue.js 2.0 如何使用axios
2017/04/21 Javascript
通过扫小程序码实现网站登陆功能
2019/08/22 Javascript
通过Kettle自定义jar包供javascript使用
2020/01/29 Javascript
python模拟表单提交登录图书馆
2018/04/27 Python
使用TensorFlow实现SVM
2018/09/06 Python
Python FFT合成波形的实例
2019/12/04 Python
PyCharm中Matplotlib绘图不能显示UI效果的问题解决
2020/03/12 Python
借助Paramiko通过Python实现linux远程登陆及sftp的操作
2020/03/16 Python
关于Python不换行输出和不换行输出end=““不显示的问题(亲测已解决)
2020/10/27 Python
CSS3毛玻璃效果(blur)有白边问题的解决方法
2016/11/15 HTML / CSS
bonprix荷兰网上商店:便宜的服装、鞋子和家居用品
2020/07/04 全球购物
什么是java序列化,如何实现java序列化
2012/11/14 面试题
用Java语言将一个键盘输入的数字转化成中文输出
2013/01/25 面试题
什么时候需要进行强制类型转换
2016/09/03 面试题
客户代表自我评价范例
2013/09/24 职场文书
交通事故和解协议书
2014/09/25 职场文书
生产工厂门卫岗位职责
2014/09/26 职场文书
劳资员岗位职责
2015/02/13 职场文书
个人年度总结报告
2015/03/09 职场文书
2015年党务公开工作总结
2015/05/19 职场文书
追悼词范文大全
2015/06/23 职场文书
债务追讨律师函
2015/06/24 职场文书
2016猴年开门红标语口号
2015/12/26 职场文书
信息技术研修心得体会
2016/01/08 职场文书
廉洁自律心得体会2016
2016/01/13 职场文书