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。否则,它将返回一个数组,其中存放了与它找到的匹配文本有关的信息。
阅读是一种修养,分享是一种美德。