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。否則,它將返回一個數組,其中存放了與它找到的匹配文本有關的信息。

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM