How to avoid scientific notation for large numbers in JavaScript?

后端 未结 22 2061
無奈伤痛
無奈伤痛 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:52

    Your question:

    number :0x68656c6c6f206f72656f
    display:4.9299704811152646e+23
    

    You can use this: https://github.com/MikeMcl/bignumber.js

    A JavaScript library for arbitrary-precision decimal and non-decimal arithmetic.

    like this:

    let ten =new BigNumber('0x68656c6c6f206f72656f',16);
    console.log(ten.toString(10));
    display:492997048111526447310191
    
    0 讨论(0)
  • 2020-11-22 00:52

    I had the same issue with oracle returning scientic notation, but I needed the actual number for a url. I just used a PHP trick by subtracting zero, and I get the correct number.

    for example 5.4987E7 is the val.

    newval = val - 0;
    

    newval now equals 54987000

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

    one more possible solution:

    function toFix(i){
     var str='';
     do{
       let a = i%10;
       i=Math.trunc(i/10);
       str = a+str;
     }while(i>0)
     return str;
    }
    
    0 讨论(0)
  • 2020-11-22 00:53

    I know it's many years later, but I had been working on a similar issue recently and I wanted to post my solution. The currently accepted answer pads out the exponent part with 0's, and mine attempts to find the exact answer, although in general it isn't perfectly accurate for very large numbers because of JS's limit in floating point precision.

    This does work for Math.pow(2, 100), returning the correct value of 1267650600228229401496703205376.

    function toFixed(x) {
      var result = '';
      var xStr = x.toString(10);
      var digitCount = xStr.indexOf('e') === -1 ? xStr.length : (parseInt(xStr.substr(xStr.indexOf('e') + 1)) + 1);
      
      for (var i = 1; i <= digitCount; i++) {
        var mod = (x % Math.pow(10, i)).toString(10);
        var exponent = (mod.indexOf('e') === -1) ? 0 : parseInt(mod.substr(mod.indexOf('e')+1));
        if ((exponent === 0 && mod.length !== i) || (exponent > 0 && exponent !== i-1)) {
          result = '0' + result;
        }
        else {
          result = mod.charAt(0) + result;
        }
      }
      return result;
    }
    
    console.log(toFixed(Math.pow(2,100))); // 1267650600228229401496703205376

    0 讨论(0)
  • 2020-11-22 00:54
    function printInt(n) { return n.toPrecision(100).replace(/\..*/,""); }
    

    with some issues:

    • 0.9 is displayed as "0"
    • -0.9 is displayed as "-0"
    • 1e100 is displayed as "1"
    • works only for numbers up to ~1e99 => use other constant for greater numbers; or smaller for optimization.
    0 讨论(0)
  • 2020-11-22 00:56

    I know this is an older question, but shows recently active. MDN toLocaleString

    const myNumb = 1000000000000000000000;
    console.log( myNumb ); // 1e+21
    console.log( myNumb.toLocaleString() ); // "1,000,000,000,000,000,000,000"
    console.log( myNumb.toLocaleString('fullwide', {useGrouping:false}) ); // "1000000000000000000000"
    

    you can use options to format the output.

    Note:

    Number.toLocaleString() rounds after 16 decimal places, so that...

    const myNumb = 586084736227728377283728272309128120398;
    console.log( myNumb.toLocaleString('fullwide', { useGrouping: false }) );
    

    ...returns...

    586084736227728400000000000000000000000

    This is perhaps undesirable if accuracy is important in the intended result.

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