How to avoid scientific notation for large numbers in JavaScript?

后端 未结 22 1917
無奈伤痛
無奈伤痛 2020-11-22 00:31

JavaScript converts a large INT to scientific notation when the number becomes large. How can I prevent this from happening?

相关标签:
22条回答
  • 2020-11-22 00:48

    The answers of others do not give you the exact number!
    This function calculates the desired number accurately and returns it in the string to prevent it from being changed by javascript!
    If you need a numerical result, just multiply the result of the function in number one!

    function toNonExponential(value) {
        // if value is not a number try to convert it to number
        if (typeof value !== "number") {
            value = parseFloat(value);
    
            // after convert, if value is not a number return empty string
            if (isNaN(value)) {
                return "";
            }
        }
    
        var sign;
        var e;
    
        // if value is negative, save "-" in sign variable and calculate the absolute value
        if (value < 0) {
            sign = "-";
            value = Math.abs(value);
        }
        else {
            sign = "";
        }
    
        // if value is between 0 and 1
        if (value < 1.0) {
            // get e value
            e = parseInt(value.toString().split('e-')[1]);
    
            // if value is exponential convert it to non exponential
            if (e) {
                value *= Math.pow(10, e - 1);
                value = '0.' + (new Array(e)).join('0') + value.toString().substring(2);
            }
        }
        else {
            // get e value
            e = parseInt(value.toString().split('e+')[1]);
    
            // if value is exponential convert it to non exponential
            if (e) {
                value /= Math.pow(10, e);
                value += (new Array(e + 1)).join('0');
            }
        }
    
        // if value has negative sign, add to it
        return sign + value;
    }
    
    0 讨论(0)
  • 2020-11-22 00:48

    You can loop over the number and achieve the rounding

    // functionality to replace char at given index

    String.prototype.replaceAt=function(index, character) {
        return this.substr(0, index) + character + this.substr(index+character.length);
    }
    

    // looping over the number starts

    var str = "123456789123456799.55";
    var arr = str.split('.');
    str = arr[0];
    i = (str.length-1);
    if(arr[1].length && Math.round(arr[1]/100)){
      while(i>0){
        var intVal = parseInt(str.charAt(i));
    
       if(intVal == 9){
          str = str.replaceAt(i,'0');
          console.log(1,str)
       }else{
          str = str.replaceAt(i,(intVal+1).toString()); 
          console.log(2,i,(intVal+1).toString(),str)
          break;
       }
       i--;
     }
    }
    
    0 讨论(0)
  • 2020-11-22 00:49

    Use .toPrecision, .toFixed, etc. You can count the number of digits in your number by converting it to a string with .toString then looking at its .length.

    0 讨论(0)
  • 2020-11-22 00:49

    This is what I ended up using to take the value from an input, expanding numbers less than 17digits and converting Exponential numbers to x10y

    // e.g.
    //  niceNumber("1.24e+4")   becomes 
    // 1.24x10 to the power of 4 [displayed in Superscript]
    
    function niceNumber(num) {
      try{
            var sOut = num.toString();
          if ( sOut.length >=17 || sOut.indexOf("e") > 0){
          sOut=parseFloat(num).toPrecision(5)+"";
          sOut = sOut.replace("e","x10<sup>")+"</sup>";
          }
          return sOut;
    
      }
      catch ( e) {
          return num;
      }
    }
    
    0 讨论(0)
  • 2020-11-22 00:50

    Here is my short variant of Number.prototype.toFixed method that works with any number:

    Number.prototype.toFixedSpecial = function(n) {
      var str = this.toFixed(n);
      if (str.indexOf('e+') === -1)
        return str;
    
      // if number is in scientific notation, pick (b)ase and (p)ower
      str = str.replace('.', '').split('e+').reduce(function(p, b) {
        return p + Array(b - p.length + 2).join(0);
      });
      
      if (n > 0)
        str += '.' + Array(n + 1).join(0);
      
      return str;
    };
    
    console.log( 1e21.toFixedSpecial(2) );       // "1000000000000000000000.00"
    console.log( 2.1e24.toFixedSpecial(0) );     // "2100000000000000000000000"
    console.log( 1234567..toFixedSpecial(1) );   // "1234567.0"
    console.log( 1234567.89.toFixedSpecial(3) ); // "1234567.890"

    0 讨论(0)
  • 2020-11-22 00:51

    The following solution bypasses the automatic exponentional formatting for very big and very small numbers. This is outis's solution with a bugfix: It was not working for very small negative numbers.

    function numberToString(num)
    {
        let numStr = String(num);
    
        if (Math.abs(num) < 1.0)
        {
            let e = parseInt(num.toString().split('e-')[1]);
            if (e)
            {
                let negative = num < 0;
                if (negative) num *= -1
                num *= Math.pow(10, e - 1);
                numStr = '0.' + (new Array(e)).join('0') + num.toString().substring(2);
                if (negative) numStr = "-" + numStr;
            }
        }
        else
        {
            let e = parseInt(num.toString().split('+')[1]);
            if (e > 20)
            {
                e -= 20;
                num /= Math.pow(10, e);
                numStr = num.toString() + (new Array(e + 1)).join('0');
            }
        }
    
        return numStr;
    }
    
    // testing ...
    console.log(numberToString(+0.0000000000000000001));
    console.log(numberToString(-0.0000000000000000001));
    console.log(numberToString(+314564649798762418795));
    console.log(numberToString(-314564649798762418795));

    0 讨论(0)
提交回复
热议问题