浮点数精度导致的数值计算问题

需求:浮点数精度导致的数值计算问题,需要对数值计算进行格式化处理,保留小数位为截取,不进行四舍五入

/**
 * 带基数、后缀的数值格式化
 * @param {*} num 源数据
 * @param {*} base 特定的基数(比如100, 1000)
 * @param {*} decimals 保留的小数位数(只截取不进位)
 * @param {*} suffix 需要带的后缀
 * @param {*} defaultStr 没数据时的默认值
 */
export const numDecimalsSuffix = (num, base, decimals, suffix, defaultStr) => {
  if (isNaN(num) || (!num && num !== 0)) {
    return defaultStr ? defaultStr : '--'
  }
  let tempNum = base ? Number(num) * base : Number(num)
  let dec = decimals ? decimals : 2
  const formatNum = (number, digit) => {
    // pow() 方法可返回 x 的 y 次幂的值
    let power = Math.pow(10, digit)
    // 源数据为整数或者小数点后面小于decimals位的不处理
    let pointIndex = String(number).indexOf('.') + 1 //获取小数点的位置 + 1
    let pointCount = pointIndex ? String(number).length - pointIndex : 0 //获取小数点后的个数(需要保证有小数
    // 默认为两位小数点
    if (pointIndex === 0 || pointCount <= dec) {
      return number
    }
    let realVal = ''
    // 截取当前数据到小数点后decimals位
    realVal = `${String(number).split('.')[0]}.${String(number).split('.')[1].substring(0, dec)}`
    return Math.floor(realVal * power) / power
  }
  tempNum = formatNum(tempNum, dec)
  // 判断截取之后数值是否为0
  if (tempNum == 0) {
    tempNum = 0
  }
  if (suffix) {
    tempNum = `${tempNum}${suffix}`
  }
  return tempNum
}

eg: numDecimalsSuffix(1345.123, 1, 2, ' ',  '--')    ==>  1345.12

      numDecimalsSuffix(1345.126, 1, 2, ' ',  '--')    ==>  1345.12

      numDecimalsSuffix(0.1 + 0.2, 1, 2, ' %',  '--')    ==>  0.3%

      numDecimalsSuffix(3.1799, 1, 2, ' %', '--'))   ==>   3.17%

      numDecimalsSuffix(3.17123, 100, 2, "%", "")   ==>   317.12%

发布了22 篇原创文章 · 获赞 11 · 访问量 5万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章