Wie rundet man ein Double in Dart mit einer bestimmten Genauigkeit NACH dem Dezimalpunkt?

99

Bei einem Double möchte ich es auf eine bestimmte Anzahl von Genauigkeitspunkten nach dem Dezimalpunkt runden, ähnlich wie bei der round () -Funktion von PHP.

Das nächste, was ich in den Dart-Dokumenten finden kann, ist double.toStringAsPrecision (), aber das ist nicht ganz das, was ich brauche, da es die Ziffern vor dem Dezimalpunkt in den Gesamtgenauigkeitspunkten enthält.

Beispiel: Verwenden von toStringAsPrecision (3):

0.123456789 rounds to 0.123  
9.123456789 rounds to 9.12  
98.123456789 rounds to 98.1  
987.123456789 rounds to 987  
9876.123456789 rounds to 9.88e+3

Mit zunehmender Größe der Zahl verliere ich entsprechend die Genauigkeit nach der Dezimalstelle.

Lucas Meadows
quelle

Antworten:

179

In den Dokumenten finden Sie num.toStringAsFixed () .

String toStringAsFixed (int fraktionDigits)

Gibt eine Dezimalpunkt-Zeichenfolgendarstellung zurück.

Konvertiert dies in ein Double, bevor die Zeichenfolgendarstellung berechnet wird.

  • Wenn der absolute Wert größer oder gleich 10 ^ 21 ist, gibt diese Methode eine exponentielle Darstellung zurück, die von this.toStringAsExponential () berechnet wurde .

Beispiele:

1000000000000000000000.toStringAsExponential(3); // 1.000e+21
  • Andernfalls ist das Ergebnis die nächstgelegene Zeichenfolgendarstellung mit genau gebrochenen Ziffern nach dem Dezimalpunkt. Wenn fraktionDigits gleich 0 ist, wird der Dezimalpunkt weggelassen.

Der Parameter FractionDigits muss eine Ganzzahl sein, die Folgendes erfüllt: 0 <= FractionDigits <= 20.

Beispiele:

1.toStringAsFixed(3);  // 1.000
(4321.12345678).toStringAsFixed(3);  // 4321.123
(4321.12345678).toStringAsFixed(5);  // 4321.12346
123456789012345678901.toStringAsFixed(3);  // 123456789012345683968.000
1000000000000000000000.toStringAsFixed(3); // 1e+21
5.25.toStringAsFixed(0); // 5
Greg Lowe
quelle
Muss die akzeptierte + Referenz + Erklärung + Beispiel sein
Kohls
1
Ich behaupte, toStringAsFixed () ist die Rundungsmethode, die aufgrund ihrer Inkonsistenz verwendet werden soll. Zum Beispiel versuchen5.550.toStringAsFixed(1)
brendan
Achten Sie auch beim Runden auf 0 Stellen, da der Ausdruck in diesem Fall ein intstatt eines zurückgibt double, z. B. num.parse(50.123.toStringAsFixed(0)) is intkann dies durch Hinzufügen .toDouble()am Ende behoben werden .
Abulka
58

num.toStringAsFixed () Runden. Dieser verwandelt Ihre Zahl (n) in eine Zeichenfolge mit der Anzahl der gewünschten Dezimalstellen (2) und analysiert sie dann in einer süßen Codezeile zurück zu Ihrer Zahl:

n = num.parse(n.toStringAsFixed(2));
Yngvar Natland
quelle
6
Das ist der schnellste Weg. Aber es ist dumm, dass Dart keinen direkten Weg hat, dies zu tun
ThinkDigital
Dies ist die beste Antwort.
Lee
1
Verlängerungsmethode: extension NumberRounding on num { num toPrecision(int precision) { return num.parse((this).toStringAsFixed(precision)); } }
Vit Veres
25

Die obigen Lösungen runden Zahlen nicht angemessen. Ich benutze:

double dp(double val, int places){ 
   double mod = pow(10.0, places); 
   return ((val * mod).round().toDouble() / mod); 
}
andyw
quelle
Bestätigt, rundet dies dp(5.550, 1)korrekt auf 5.6- im Gegensatz zu der beliebtesten Antwort, die eine leicht falsche Antwort von 5.5@brendan hervorhebt.
Abulka
19
void main() {
  int decimals = 2;
  int fac = pow(10, decimals);
  double d = 1.234567889;
  d = (d * fac).round() / fac;
  print("d: $d");
}

Drucke: 1.23

Robert
quelle
1
Dies ist der derzeit beste Weg, dies zu tun. Das Runden auf eine Genauigkeit wie 0,01, die selbst kein Doppel ist, ist nicht trivial. Das Ergebnis kann möglicherweise überhaupt nicht als Doppel dargestellt werden. Ich empfehle dringend, Ganzzahlen für alles zu verwenden, wo Dezimalgenauigkeit wichtig ist (z. B. Geld).
lrn
1
Erwähnenswert ist auch, dass beim Kompilieren in js auch Dart-Ganzzahlen an Genauigkeit verlieren und Sie ein Paket wie das folgende verwenden müssen: pub.dartlang.org/packages/bignum
Greg Lowe
Diese Methode scheint die derzeit beste und eleganteste Methode zu sein.
Giovanni Terlingen
double kann nicht zugeordnet werden int Fehler tritt in Zeile 3
Gayan Pathirage
8

Die modifizierte Antwort von @andyw mit Dart Extension-Methoden:

extension Precision on double {
    double toPrecision(int fractionDigits) {
        double mod = pow(10, fractionDigits.toDouble());
        return ((this * mod).round().toDouble() / mod);
    }
}

Verwendung:

var latitude = 1.123456;
var latitudeWithFixedPrecision = latitude.toPrecision(3); // Outputs: 1.123
Kubastick
quelle
7

Um ein Double in Dart nach dem Dezimalpunkt auf eine bestimmte Genauigkeit zu runden, können Sie die integrierte Dart-Lösung toStringAsFixed()verwenden, diese jedoch wieder in Double konvertieren

void main() {
  double step1 = 1/3;  
  print(step1); // 0.3333333333333333
  
  String step2 = step1.toStringAsFixed(2); 
  print(step2); // 0.33 
  
  double step3 = double.parse(step2);
  print(step3); // 0.33
}
Sultanmyrza Kasymbekov
quelle
2

Ich habe die Methode toStringAsFixed () verwendet, um die Zahl nach dem Dezimalpunkt EX auf bestimmte Zahlen zu runden: double num = 22.48132906 und wenn ich auf zwei Zahlen wie diese gerundet habe: print (num.toStringAsFixed (2);

es druckte 22,48

und als ich auf eine Zahl gerundet habe .. gedruckt 22.5

Sana'a Al-ahdal
quelle
2

Die oben genannten Lösungen funktionieren nicht in allen Fällen. Was für mein Problem funktioniert hat, war diese Lösung, die Ihre Zahl rundet (0,5 zu 1 oder 0,49 zu 0) und ohne Dezimalstellen belässt :

Eingabe: 12.67

double myDouble = 12.67;
var myRoundedNumber; // Note the 'var' datatype

// Here I used 1 decimal. You can use another value in toStringAsFixed(x)
myRoundedNumber = double.parse((myDouble).toStringAsFixed(1));
myRoundedNumber = myRoundedNumber.round();

print(myRoundedNumber);

Ausgabe: 13

Dieser Link hat auch andere Lösungen

Runsis
quelle
0

Sie können verwenden toStringAsFixed, um die begrenzten Ziffern nach Dezimalstellen anzuzeigen. toStringAsFixedGibt eine Dezimalpunkt-Zeichenfolgendarstellung zurück. toStringAsFixedakzeptiert ein Argument namens, fraction Digitsdas angibt, wie viele Stellen nach der Dezimalstelle angezeigt werden sollen. Hier erfahren Sie, wie Sie es verwenden.

double pi = 3.1415926;
const val = pi.toStringAsFixed(2); // 3.14
Hadi Mir
quelle
-2

Das funktioniert ziemlich gut

var price=99.012334554
price = price.roundTodouble();
print(price); // 99.01
Andrew Kawalya
quelle