Unterschied zwischen toFixed () und toPrecision ()?
124
Ich bin neu in JavaScript und habe gerade entdeckt toFixed()und toPrecision()Zahlen gerundet. Ich kann jedoch nicht herausfinden, was der Unterschied zwischen den beiden ist.
Was ist der Unterschied zwischen number.toFixed()und number.toPrecision()?
EDIT :
Ich habe vor einiger Zeit erfahren, dass w3schools nicht gerade die beste Quelle ist, aber ich habe diese Antwort vergessen, bis ich den "enthusiastischen" Kommentar von kzh sah. Hier finden Sie zusätzliche Referenzen aus dem Mozilla Doc Center fürtoFixed() und fürtoPrecision() . Zum Glück für uns alle sind sich MDC und w3schools in diesem Fall einig.
Der Vollständigkeit halber sollte ich erwähnen, dass toFixed()dies der ursprünglichen Nummer ohne Formatierung entspricht toFixed(0)und diese toPrecision()nur zurückgibt.
Bah, ich habe das im Juli 2010 gepostet und erst in diesem Jahr etwas über w3fools gelernt. Während Dummköpfe in einigen Dingen Recht haben, ist nicht alles in den Schulen falsch. Vielen Dank für den Hinweis, dass ich diesen Beitrag aktualisieren muss. werde es gleich tun.
Pops
24
toPrecision(x)bietet keine " xGesamtlänge", sondern formatiert eine Reihe von bestimmten signifikanten Stellen. Zum Beispiel 0.0000022.toPrecision(1)würde zurückkehren 0.000002.
Andy E
5
Ich habe gerade w3fools besucht und war überhaupt nicht überzeugt. Ich sehe nicht einmal ein Argument. Ich sehe nur eine Werbung für zwei andere Websites.
NiCk Newman
2
Die Aussage "... toPrecision(x)liefert die xGesamtlänge." gilt nicht unbedingt. 0.00001234.toPrecision(3)
Gegenbeispiel
59
Ich glaube, dass Ersteres Ihnen eine feste Anzahl von Dezimalstellen gibt, während Letzteres Ihnen eine feste Anzahl von signifikanten Stellen gibt.
Ich denke, dies lässt sich am besten mit einem Beispiel beantworten.
Angenommen, Sie haben folgende Daten:
var products =[{"title":"Really Nice Pen","price":150},{"title":"Golf Shirt","price":49.99},{"title":"My Car","price":1234.56}]
Sie möchten jedes dieser Produkte mit dem Titel und dem formatierten Preis anzeigen. Versuchen wir es toPrecisionzuerst:
document.write("The price of "+ products[0].title +" is $"+ products[0].price.toPrecision(5));The price ofReallyNicePen is $150.00
Sieht gut aus, also könnte man denken, dass dies auch für die anderen Produkte funktioniert:
document.write("The price of "+ products[1].title +" is $"+ products[2].price.toPrecision(5));
document.write("The price of "+ products[2].title +" is $"+ products[2].price.toPrecision(5));The price ofGolfShirt is $49.990The price ofMyCar is $1234.6
Nicht so gut. Wir können dies beheben, indem wir die Anzahl der signifikanten Stellen für jedes Produkt ändern. Wenn wir jedoch die Produktreihe durchlaufen, kann dies schwierig sein. Verwenden wir toFixedstattdessen:
document.write("The price of "+ products[0].title +" is $"+ products[0].price.toFixed(2));
document.write("The price of "+ products[1].title +" is $"+ products[2].price.toFixed(2));
document.write("The price of "+ products[2].title +" is $"+ products[2].price.toFixed(2));The price ofReallyNicePen is $150.00The price ofGolfShirt is $49.99The price ofMyCar is $1234.56
Dies ergibt das, was Sie erwartet haben. Es gibt keine Vermutungen und keine Rundungen.
@ Lord Torgamus: Laut meiner Kopie von Javascript: The Definitive Guide verwendet toPrecision (Genauigkeit) die Festkommanotation, wenn das Genauigkeitsarg groß genug ist, um alle Ziffern des ganzzahligen Teils der Zahl aufzunehmen. Andernfalls wird die Exponentialschreibweise verwendet.
Robusto
In zumindest einigen Fällen ist dies nicht korrekt ist : in meinem Firefox, mit a = 999999999999999934464;, a.toFixed(0)kehrt "1e+21". Eine genauere Antwort wäre vielleicht, dass toFixed () keine exponentielle Notation zurückgibt, es sei denn, toString () tut dies.
der Paul
1
Zum Beispiel betrachten wir die Variable a als, var a = 123,45 a.toPrecision (6) Die Ausgabe ist 123.450 a.toFixed (6) Die Ausgabe ist wie 123.450000 // 6 Stellen nach dem Dezimalpunkt
Beides toPrecision()und toFixed()sind Funktionen zum Formatieren einer Zahl vor dem Ausdrucken. Also kehren beide zurückString Werte zurück.
Es gibt eine Ausnahme. Wenn Sie diese Funktionen für ein negatives Zahlenliteral verwenden, wird aufgrund der Priorität des Operators eine Zahl zurückgegeben. Dies bedeutet, dass toFixed()oder toPrecision()zuerst eine Zeichenfolge und dann die zurückgegeben wird- Minusoperator die Zeichenfolge dann wieder in eine Zahl als negativen Wert konvertiert. Ein Beispiel finden Sie weiter unten.
toPrecision()Gibt eine StringDarstellung des Number-Objekts in Festkomma- oder Exponentialschreibweise zurück, die auf signifikante Stellen gerundet ist. Wenn Sie also angeben, dass Sie eine Genauigkeit von 1 wünschen, wird die erste signifikante Zahl zusammen mit der wissenschaftlichen Notation zurückgegeben, um die Potenzen von 10 oder die vorherigen Nullen vor dem Dezimalpunkt anzugeben, wenn die signifikante Zahl <0 ist.
const num1 =123.4567;// if no arguments are passed, it is similar to converting the Number to String
num1.toPrecision();// returns "123.4567// scientific notation is used when you pass precision count less than total// number of digits left of the period
num1.toPrecision(2);// returns "1.2e+2"// last digit is rounded if precision is less than total significant digits
num1.toPrecision(4);// returns "123.5"
num1.toPrecision(5);// returns "123.46"const largeNum =456.789;
largeNum.toPrecision(2);// returns "4.6e+2"// trailing zeroes are added if precision is > total digits of the number or float
num1.toPrecision(9);// returns "123.456700"const num2 =123;
num2.toPrecision(4);// returns "123.0"const num3 =0.00123;
num3.toPrecision(4);// returns "0.001230"
num3.toPrecision(5);// returns "0.0012300"// if the number is < 1, precision is by the significant digits
num3.toPrecision(1);// returns "0.001"
toFixed()Gibt eine StringDarstellung des Number-Objekts in Festkomma-Notation, aufgerundet, zurück. Diese Funktion kümmert sich nur um die Dezimalstellen
const num1 =123.4567;// if no argument is passed, the fractions are removed
num1.toFixed();// returns "123"// specifying an argument means you the amount of numbers after the decimal point
num1.toFixed(1);// returns "123.5"
num1.toFixed(3);// returns "123.457"
num1.toFixed(5);// returns "123.45670"
num1.toFixed(7);// returns "123.4567000"// trying to operator on number literals2.34.toFixed(1);// returns "2.3"2.toFixed(1);// returns SyntaxError(2).toFixed(1);// returns "2.0"(2.34e+5).toFixed(1);// returns "234000.0"
Ich habe oben eine Ausnahme erwähnt, bei der die Verwendung dieser Funktionen für negative Zahlenliterale aufgrund der Priorität des Operators eine Zahl und keine Zeichenfolge zurückgibt. Hier sind einige Beispiele:
// Note: these are returning as Number// toPrecision()-123.45.toPrecision();// returns -123.45-123.45.toPrecision(2);// returns -120-123.45.toPrecision(4);// returns -123.5-2.34e+2.toPrecision(1);// returns -200-0.0456.toPrecision(1);// returns -0.05-0.0456.toPrecision(6);// returns -0.0456// toFixed()-123.45.toFixed();// returns -123.45-123.45.toFixed(1);// returns -123.5-123.45.toFixed(4);// returns -123.45-0.0456.toFixed(1);// returns -0-0.0456.toFixed(6);// -0.0456
Unterhaltsame Tatsache: Es gibt vorzeichenbehaftete Nullen, wie von -0.0456.toFixed(1)
toPrecision(x)
bietet keine "x
Gesamtlänge", sondern formatiert eine Reihe von bestimmten signifikanten Stellen. Zum Beispiel0.0000022.toPrecision(1)
würde zurückkehren0.000002
.toPrecision(x)
liefert diex
Gesamtlänge." gilt nicht unbedingt.0.00001234.toPrecision(3)
Ich glaube, dass Ersteres Ihnen eine feste Anzahl von Dezimalstellen gibt, während Letzteres Ihnen eine feste Anzahl von signifikanten Stellen gibt.
Darüber hinaus
toPrecision
ergibt sich eine wissenschaftliche Notation, wenn die Zahl mehr ganzzahlige Ziffern als die angegebene Genauigkeit enthält.EDIT: Oh, und wenn Sie neu in JavaScript sind, kann ich das Buch " JavaScript: The Good Parts " von Douglas Crockford sehr empfehlen .
quelle
Beispiele sprechen klar:
quelle
Ich denke, dies lässt sich am besten mit einem Beispiel beantworten.
Angenommen, Sie haben folgende Daten:
Sie möchten jedes dieser Produkte mit dem Titel und dem formatierten Preis anzeigen. Versuchen wir es
toPrecision
zuerst:Sieht gut aus, also könnte man denken, dass dies auch für die anderen Produkte funktioniert:
Nicht so gut. Wir können dies beheben, indem wir die Anzahl der signifikanten Stellen für jedes Produkt ändern. Wenn wir jedoch die Produktreihe durchlaufen, kann dies schwierig sein. Verwenden wir
toFixed
stattdessen:Dies ergibt das, was Sie erwartet haben. Es gibt keine Vermutungen und keine Rundungen.
quelle
Gerade:
quelle
Gibt unter bestimmten Umständen
toPrecision()
die Exponentialschreibweise zurück, während diestoFixed()
nicht der Fall ist .quelle
toExponential()
ist eine separate Funktion .a = 999999999999999934464;
,a.toFixed(0)
kehrt"1e+21"
. Eine genauere Antwort wäre vielleicht, dass toFixed () keine exponentielle Notation zurückgibt, es sei denn, toString () tut dies.Zum Beispiel betrachten wir die Variable a als, var a = 123,45 a.toPrecision (6) Die Ausgabe ist 123.450 a.toFixed (6) Die Ausgabe ist wie 123.450000 // 6 Stellen nach dem Dezimalpunkt
quelle
Beides
toPrecision()
undtoFixed()
sind Funktionen zum Formatieren einer Zahl vor dem Ausdrucken. Also kehren beide zurückString
Werte zurück.Es gibt eine Ausnahme. Wenn Sie diese Funktionen für ein negatives Zahlenliteral verwenden, wird aufgrund der Priorität des Operators eine Zahl zurückgegeben. Dies bedeutet, dass
toFixed()
odertoPrecision()
zuerst eine Zeichenfolge und dann die zurückgegeben wird-
Minusoperator die Zeichenfolge dann wieder in eine Zahl als negativen Wert konvertiert. Ein Beispiel finden Sie weiter unten.toPrecision()
Gibt eineString
Darstellung des Number-Objekts in Festkomma- oder Exponentialschreibweise zurück, die auf signifikante Stellen gerundet ist. Wenn Sie also angeben, dass Sie eine Genauigkeit von 1 wünschen, wird die erste signifikante Zahl zusammen mit der wissenschaftlichen Notation zurückgegeben, um die Potenzen von 10 oder die vorherigen Nullen vor dem Dezimalpunkt anzugeben, wenn die signifikante Zahl <0 ist.toFixed()
Gibt eineString
Darstellung des Number-Objekts in Festkomma-Notation, aufgerundet, zurück. Diese Funktion kümmert sich nur um die DezimalstellenIch habe oben eine Ausnahme erwähnt, bei der die Verwendung dieser Funktionen für negative Zahlenliterale aufgrund der Priorität des Operators eine Zahl und keine Zeichenfolge zurückgibt. Hier sind einige Beispiele:
Unterhaltsame Tatsache: Es gibt vorzeichenbehaftete Nullen, wie von
-0.0456.toFixed(1)
Siehe: Sind +0 und -0 gleich?
quelle