(一)科學計數法的類型是數值類型
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 } } } }
其實,上述的處理過程適用於所有的場景,不過處理過程還是有點繁瑣,可以繼續往后查看,會有更簡單的處理方式。
(二)科學計數法的類型是字符串類型
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。否則,它將返回一個數組,其中存放了與它找到的匹配文本有關的信息。