避坑之 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 相关文章推荐
一个符号插入器 中用到的js代码
Sep 04 Javascript
RGB颜色值转HTML十六进制(HEX)代码的JS函数
Apr 25 Javascript
javascript Array.sort() 跨浏览器下需要考虑的问题
Dec 07 Javascript
用AJAX返回HTML片段中的JavaScript脚本
Jan 04 Javascript
Extjs TimeField 显示正常时间格式的代码
Jun 28 Javascript
jquery中常用的SET和GET$(”#msg”).html循环介绍
Oct 09 Javascript
js的回调函数详解
Jan 05 Javascript
jquery+html5制作超酷的圆盘时钟表
Apr 14 Javascript
手机Web APP如何实现分享多平台功能
Aug 19 Javascript
JS简单实现tab切换效果的多窗口显示功能
Sep 07 Javascript
vue裁切预览组件功能的实现步骤
May 04 Javascript
Layui动态生成select下拉选择框不显示的解决方法
Sep 24 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的返回引用和局部静态变量
2015/06/04 PHP
PHP使用栈解决约瑟夫环问题算法示例
2017/08/27 PHP
javascript 动态添加表格行
2006/06/22 Javascript
兼容多浏览器的iframe自适应高度(ie8 、谷歌浏览器4.0和 firefox3.5.3)
2009/11/04 Javascript
根据邮箱的域名跳转到相应的登录页面的代码
2012/02/27 Javascript
基于jquery的文字向上跑动类似跑马灯的效果
2014/09/22 Javascript
jquery的总体架构分析及实现示例详解
2014/11/08 Javascript
jQuery检查事件是否触发的方法
2015/06/26 Javascript
JS组件系列之Bootstrap table表格组件神器【二、父子表和行列调序】
2016/05/10 Javascript
实例讲解Jquery中隐藏hide、显示show、切换toggle的用法
2016/05/13 Javascript
JS监听微信、支付宝等移动app及浏览器的返回、后退、上一页按钮的事件方法
2016/08/05 Javascript
JavaScript与java语言有什么不同
2016/09/22 Javascript
Jquery 整理元素选取、常用方法一览表
2016/11/26 Javascript
js实现百度地图定位于地址逆解析,显示自己当前的地理位置
2016/12/08 Javascript
详解nodejs微信公众号开发——3.封装消息响应模块
2017/04/10 NodeJs
VUE实现自身整体组件销毁的示例代码
2020/01/13 Javascript
vuex实现购物车的增加减少移除
2020/06/28 Javascript
Python性能优化技巧
2015/03/09 Python
python获取一组汉字拼音首字母的方法
2015/07/01 Python
Python中将变量按行写入txt文本中的方法
2018/04/03 Python
python 通过 socket 发送文件的实例代码
2018/08/14 Python
python使用Plotly绘图工具绘制气泡图
2019/04/01 Python
Django配置MySQL数据库的完整步骤
2019/09/07 Python
PyTorch 随机数生成占用 CPU 过高的解决方法
2020/01/13 Python
CSS3 Columns分列式布局方法简介
2014/05/03 HTML / CSS
css3实现小箭头各种图形效果
2020/07/08 HTML / CSS
使用HTML5的表单验证的简单示例
2015/09/09 HTML / CSS
处理HTML5新标签的浏览器兼容版问题
2017/03/13 HTML / CSS
夏威夷灵感服装及配饰:Reyn Spooner
2018/09/18 全球购物
Ego Shoes官网:英国时髦鞋类品牌
2020/10/19 全球购物
生产厂厂长岗位职责
2013/12/25 职场文书
成绩单公证书
2014/04/10 职场文书
义和团口号
2014/06/17 职场文书
经济贸易系求职信
2014/08/04 职场文书
爱的奉献演讲稿
2014/09/10 职场文书
初中军训感想
2015/08/07 职场文书