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?
Antworten
Zu viele Anzeigen?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
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;
}
}
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--;
}
}
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!