js小数字保留两位有效位数或者多位-防止精度丢失-保留两位有效数字
迪丽瓦拉
2025-05-29 12:17:15
0

js小数字保留两位有效位数或者多位-防止精度丢失

前端开发在处理保留小数位数的时候遇到一个坑,保留两位有效位数
**保留两位有效位数:**例如:1.00000567,保留成1.0000057,有效数字的两位小数(上学时候好像学过这种数字,忘了,哈哈哈)
翻了很长时间百度,没有找到直接能用的方法。。。于是自己封装了一下,记录一下,有用到的直接拿去。
先上处理方法的代码,拿去直接使用:

方法1(推荐):

/*** 适合处理小数位数特别多的情况,不会丢失精度(但是直接传入字符串的数字)* @param {*} newnum 需要转化的数字(字符串)* @param {*} bitnum 需要转化为几位有效位数* @returns 需要转化为几位有效数字*/
const ToEffectiveNum = (newnum, bitnum = 2) => {if (isNaN(newnum)) {return 0;}if (newnum === 0 || newnum === '0') {return 0;}if (typeof newnum === 'number') {newnum = newnum.toString();} if (typeof newnum === 'string') {const fast = newnum.split('.')[0]; // 拿小数点前面的内容(字符串)if (Number(fast)>0) { // 如果小数点前面的内容大于0,直接返回return Number(newnum).toFixed(2)}const last = newnum.split('.')[1]; // 拿小数点后面的内容(字符串)if (!last) return Number(newnum).toFixed(2) // 如果没有小数点后面的内容,直接返回const index1 = last.split('').findIndex(item => item !== '0') // 不是0的第一个位置索引if (index1 === -1) return Number(newnum).toFixed(2) // 如果小数点后面的内容全是0,直接返回if(index1 === 0) return Number(newnum).toFixed(2) // 说明直接保留两位即可return Number(newnum).toFixed(index1+2) // 返回结果(Number类型)}
}
console.log(ToEffectiveNum('0.0000000000011745')); // 0.0000000000012

这个处理方法不会以为传入的位数太多导致精度丢失等问题(推荐)。

方法2(比较推荐):

/**
* 可以直接数字num
* 适合处理位数不会特别多的小数
* 缺点:小数位数太多无法处理,会返回0
*/ 
const liangweiunm = function istownum(num) {const str = num.toString();const houmian = str.substring(str.indexOf('.')+1, str.length); // 拿小数点后面的内容(字符串)const zhuanshuzi = Number(houmian) // 转换成数字后会自动去掉开头的0const indexNew = houmian.indexOf(zhuanshuzi); // 拿到小数点后面的数字的位置const result = num.toFixed(indexNew+2);return result;
}
console.log('liangweiunm', liangweiunm(54456456));

方法3:

const value = 0.0000008;
(function significantNum(value, count = 1) {let newNum = count;let value1 = parseFloat(value);let newData = value1.toFixed(newNum + 1);if (value1 === 0) {return newData;}if (parseFloat(value1.toFixed(2)) === 0) {if (parseInt(value1 * Math.pow(10, newNum)) === 0) {newNum++;return significantNum(value1, newNum);} else {newData = value1.toFixed(newNum + 1);}} else {newData = value1.toFixed(2);}console.log(newData);return newData;
}
)(value)

(这个方法目前只是处理0开头的小数,,其他的没有做判断,因为做到这里发现方案不太可行,效率太低了)

运行效果就上一个截图吧。
在这里插入图片描述

写在最后

✨个人笔记博客✨

星月前端博客
http://blog.yhxweb.top/

✨原创不易,还希望各位大佬支持一下

👍 点赞,你的认可是我创作的动力!

⭐️ 收藏,你的青睐是我努力的方向!

✏️评论,你的意见是我进步的财富!

相关内容

热门资讯

linux入门---制作进度条 了解缓冲区 我们首先来看看下面的操作: 我们首先创建了一个文件并在这个文件里面添加了...
C++ 机房预约系统(六):学... 8、 学生模块 8.1 学生子菜单、登录和注销 实现步骤: 在Student.cpp的...
A.机器学习入门算法(三):基... 机器学习算法(三):K近邻(k-nearest neigh...
数字温湿度传感器DHT11模块... 模块实例https://blog.csdn.net/qq_38393591/article/deta...
有限元三角形单元的等效节点力 文章目录前言一、重新复习一下有限元三角形单元的理论1、三角形单元的形函数(Nÿ...
Redis 所有支持的数据结构... Redis 是一种开源的基于键值对存储的 NoSQL 数据库,支持多种数据结构。以下是...
win下pytorch安装—c... 安装目录一、cuda安装1.1、cuda版本选择1.2、下载安装二、cudnn安装三、pytorch...
MySQL基础-多表查询 文章目录MySQL基础-多表查询一、案例及引入1、基础概念2、笛卡尔积的理解二、多表查询的分类1、等...
keil调试专题篇 调试的前提是需要连接调试器比如STLINK。 然后点击菜单或者快捷图标均可进入调试模式。 如果前面...
MATLAB | 全网最详细网... 一篇超超超长,超超超全面网络图绘制教程,本篇基本能讲清楚所有绘制要点&#...
IHome主页 - 让你的浏览... 随着互联网的发展,人们越来越离不开浏览器了。每天上班、学习、娱乐,浏览器...
TCP 协议 一、TCP 协议概念 TCP即传输控制协议(Transmission Control ...
营业执照的经营范围有哪些 营业执照的经营范围有哪些 经营范围是指企业可以从事的生产经营与服务项目,是进行公司注册...
C++ 可变体(variant... 一、可变体(variant) 基础用法 Union的问题: 无法知道当前使用的类型是什...
血压计语音芯片,电子医疗设备声... 语音电子血压计是带有语音提示功能的电子血压计,测量前至测量结果全程语音播报࿰...
MySQL OCP888题解0... 文章目录1、原题1.1、英文原题1.2、答案2、题目解析2.1、题干解析2.2、选项解析3、知识点3...
【2023-Pytorch-检... (肆十二想说的一些话)Yolo这个系列我们已经更新了大概一年的时间,现在基本的流程也走走通了,包含数...
实战项目:保险行业用户分类 这里写目录标题1、项目介绍1.1 行业背景1.2 数据介绍2、代码实现导入数据探索数据处理列标签名异...
记录--我在前端干工地(thr... 这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 前段时间接触了Th...
43 openEuler搭建A... 文章目录43 openEuler搭建Apache服务器-配置文件说明和管理模块43.1 配置文件说明...