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

文章介绍了三种JavaScript方法来处理小数字并保留两位有效位数,以防止精度丢失。主要方法包括直接使用toFixed()方法和自定义函数,适用于不同场景,特别是处理大量小数时。作者提供了代码示例并分享了个人博客链接。

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) // 转换成数字后会自动去掉开头的0
  const 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/

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

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

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

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

星月前端

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值