zoukankan      html  css  js  c++  java
  • 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。否则,它将返回一个数组,其中存放了与它找到的匹配文本有关的信息。

      

  • 相关阅读:
    SpringBoot分布式篇Ⅷ --- 整合SpringCloud
    SpringBoot分布式篇Ⅶ --- 整合Dubbo
    java.lang.IllegalArgumentException: There is no PasswordEncoder mapped for the id "null"
    小学数学题
    GoLang GRPC使用
    GoLang Socket 聊天实例
    golang Redis运用
    go mod 运用
    Golang Socket编程小实例
    GoLang协程和管道
  • 原文地址:https://www.cnblogs.com/bien94/p/12728886.html
Copyright © 2011-2022 走看看