314 Stimmen

Wie kann man die wissenschaftliche Notation für große Zahlen in JavaScript vermeiden?

JavaScript konvertiert ganze Zahlen mit mehr als 21 Ziffern in wissenschaftliche Notation, wenn sie in einem String-Kontext verwendet werden. Ich gebe eine ganze Zahl als Teil einer URL aus. Wie kann ich diese Umwandlung verhindern?

2voto

super2bai Punkte 29

Ihre Frage:

number :0x68656c6c6f206f72656f
display:4.9299704811152646e+23

Sie können dies verwenden: https://github.com/MikeMcl/bignumber.js

Eine JavaScript-Bibliothek für dezimale und nicht-dezimale Arithmetik mit beliebiger Genauigkeit.

wie diese:

let ten =new BigNumber('0x68656c6c6f206f72656f',16);
console.log(ten.toString(10));
display:492997048111526447310191

2voto

Utilisez .toPrecision , .toFixed , usw. Sie können die Anzahl der Ziffern in Ihrer Zahl zählen, indem Sie sie in eine Zeichenkette umwandeln mit .toString dann bei der Betrachtung seiner .length .

2voto

Tyeth Punkte 669

Dies ist, was ich am Ende verwenden, um den Wert aus einer Eingabe zu nehmen, erweitern Zahlen weniger als 17digits und Konvertierung Exponential Zahlen zu x10 y

// 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;
  }
}

2voto

Kapil gopinath Punkte 1200

Sie können eine Schleife über die Zahl ziehen und die Rundung erreichen

// Funktionalität zum Ersetzen eines Zeichens am angegebenen Index

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

// Schleifenbildung über die Zahl beginnt

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--;
 }
}

1voto

cmarangu Punkte 165

Ich glaube, es gibt mehrere ähnliche Antworten, aber hier ist eine, die ich mir ausgedacht habe

// If you're gonna tell me not to use 'with' I understand, just,
// it has no other purpose, ;( andthe code actually looks neater
// 'with' it but I will edit the answer if anyone insists
var commas = false;

function digit(number1, index1, base1) {
    with (Math) {
        return floor(number1/pow(base1, index1))%base1;
    }
}

function digits(number1, base1) {
    with (Math) {
        o = "";
        l = floor(log10(number1)/log10(base1));
        for (var index1 = 0; index1 < l+1; index1++) {
            o = digit(number1, index1, base1) + o;
            if (commas && i%3==2 && i<l) {
                o = "," + o;
            }
        }
        return o;
    }
}

// Test - this is the limit of accurate digits I think
console.log(1234567890123450);

Hinweis: Dies ist nur so genau wie die Javascript-Mathematik-Funktionen und hat Probleme bei der Verwendung von log anstelle von log10 in der Zeile vor der for-Schleife; es wird 1000 in Basis-10 als 000 schreiben, so dass ich es in log10 geändert habe, weil die Leute meistens sowieso Basis-10 verwenden werden.

Dies ist vielleicht keine sehr genaue Lösung, aber ich bin stolz darauf, sagen zu können, dass es erfolgreich Zahlen zwischen Basen übersetzen kann und eine Option für Kommas hat!

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X