JS将科学计数法转换成数据值的方式

  (一)科学计数法的类型是数值类型

  1、指数是正数

  • 与空字符直接相加
let eformat = 1.34e5
let number = '' + eformat 或者 eform + ''
console.log('结果是:',number)
结果是:134000

  • 调用toString()方法
let eformat = 1.34e5
let number = eformat.toString()
console.log('结果是:',number)
结果是:134000

  2、指数是负数

  • 若指数值是大于或者等于-6的话,那么可以通过上面两种方法来求解
  • 若指数值是小于-6的话,那么就需特殊处理了,请见下面示例函数:
let eformat = 1.34e-7
      let number = eformat
      let tmpVal = '' + eformat
      let ee = tmpVal.replace(/[\d.-]/g, '')if (ee) {
        if (ee === 'E' || ee === 'e') {
          let pos = tmpVal.indexOf('E')
          if (pos === -1) {
            pos = tmpVal.indexOf('e')
          }
          console.log('pos:', pos)
          let power = tmpVal.substr(pos + 1)
          console.log('power:', power)
          if (power === '') {
            let baseValue = tmpVal.substr(0, pos)
            number = baseValue
            // 不调用Number函数了,防止转换为科学计数法了
          } else {
            let baseValue = tmpVal.substr(0, pos)
            let character = power.substr(0, 1)if (character === '-') {
              let times = power.substr(1)
              if (times === '' || times === '0') {
                number = baseValue 
                // 不调用Number函数了,防止转换为科学计数法了
              } else {
                times = Number(times)
                let baseValueLength = baseValue.length
                let floatLength = baseValue.indexOf('.') + 1
                let length = baseValueLength - floatLength
                number = eformat.toFixed(length + times)
                // 这里只能以字符串形式输出了,不能再调用Number函数
              }                  
            } else {
              let powerVal = Math.pow(10, power)
              number = baseValue * powerVal
            }
          }
        }
      }
        console.log('结果是:', number) // 结果是: 0.000000134

   其实,上述的处理过程适用于所有的场景,不过处理过程还是有点繁琐,可以继续往后查看,会有更简单的处理方式。

  (二)科学计数法的类型是字符串类型

   1、指数是正数

let eformat = '1.34e7'
let number = parseFloat(eformat)
console.log('结果是:', number) //13400000

  此时,直接通过parseFloat函数来处理即可。

  2、指数是负数

  • 指数值大于或者等于-6,那么可以直接通过parseFloat函数来处理
  • 指数值小于-6的情况,可以参考(一)中指数值是小于-6的情况的处理过程,不过首先需要通过parseFloat函数进行转换处理,然后再调用上述的处理流程

  (三)改进的方式

function transferToNumber(inputNumber ){
      if (isNaN(inputNumber)) {
        return inputNumber
      }
      inputNumber = '' + inputNumber
      inputNumber = parseFloat(inputNumber)
      let eformat = inputNumber.toExponential() // 转换为标准的科学计数法形式(字符串)
      let pos = eformat.indexOf('e')
      let baseValue = eformat.substr(0, pos)
      let power = eformat.substr(pos + 1)
      let bitNumber = 0
      pos = baseValue.indexOf('.')
      if (pos === -1) {
        bitNumber = 0 - power
      } else {
        let float = baseValue.substr(pos + 1)
        bitNumber = float.length - power
      }
      let number = inputNumber.toFixed(Math.max(0, bitNumber))
      return number
}

  支持所有的场景转换处理。

  (四)优秀的方式

function transferToNumber(inputNumber) {
      if (isNaN(inputNumber)) {
        return inputNumber
      }
      inputNumber = '' + inputNumber
      inputNumber = parseFloat(inputNumber)
      let eformat = inputNumber.toExponential() // 转换为标准的科学计数法形式(字符串)
      let tmpArray = eformat.match(/\d(?:\.(\d*))?e([+-]\d+)/) // 分离出小数值和指数值
      let number = inputNumber.toFixed(Math.max(0, (tmpArray[1] || '').length - tmpArray[2]))
return number }

  上述处理流程支持Number和String类型的科学计数法数值,利用toExponential()函数来将输入数值进行科学计数法标准处理,并且以小写的字母e表示和正、负号,同时该函数也支持一个整型的输入参数,表示保留的小数位数,并且支持四舍五入;toFixed()函数也支持四舍五入;此外,这里还主要利用match函数和正则表达式,获取到小数位的长度和指数值,例如:

  '1.34e-7'.match(/\d(?:\.(\d*))?e([+-]\d+)/) 的结果是:["1.34e-7", "34", "-7"] 

  '1.34e+7'.match(/\d(?:\.(\d*))?e([+-]\d+)/) 的结果是:["1.34e+7", "34", "+7"] 

  备注: match() 方法将检索字符串 String Object,以找到一个或多个与 regexp 匹配的文本。这个方法的行为在很大程度上有赖于 regexp 是否具有标志 g。如果 regexp 没有标志 g,那么 match() 方法就只能在 stringObject 中执行一次匹配。如果没有找到任何匹配的文本, match() 将返回 null。否则,它将返回一个数组,其中存放了与它找到的匹配文本有关的信息。

  

posted @ 2020-04-18 23:06  晒太阳的兔子很忙  阅读(13133)  评论(0编辑  收藏  举报