Biorąc pod uwagę wartość podwójną, chcę zaokrąglić ją do określonej liczby dokładnych punktów po przecinku , podobnie jak w funkcji round () w PHP.
Najbliższą rzeczą, jaką mogę znaleźć w dokumentach Dart, jest double.toStringAsPrecision (), ale nie jest to do końca to, czego potrzebuję, ponieważ zawiera cyfry przed kropką dziesiętną w łącznej liczbie punktów dokładności.
Na przykład, używając 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
Wraz ze wzrostem wielkości liczby odpowiednio tracę precyzję po przecinku.
źródło
5.550.toStringAsFixed(1)
int
zamiast adouble
, np.num.parse(50.123.toStringAsFixed(0)) is int
- można to naprawić, dodając.toDouble()
na jego końcu.num.toStringAsFixed()
rundy. Ten zamienia num (n) w ciąg z żądaną liczbą miejsc po przecinku (2), a następnie analizuje go z powrotem do twojego num w jednej słodkiej linii kodu:n = num.parse(n.toStringAsFixed(2));
źródło
extension NumberRounding on num { num toPrecision(int precision) { return num.parse((this).toStringAsFixed(precision)); } }
Powyższe rozwiązania nie zaokrągla odpowiednio liczb. Używam:
double dp(double val, int places){ double mod = pow(10.0, places); return ((val * mod).round().toDouble() / mod); }
źródło
dp(5.550, 1)
poprawnie do5.6
- w przeciwieństwie do najpopularniejszej odpowiedzi, która daje nieco niepoprawną odpowiedź,5.5
jak wskazał @brendan.var price = 99.012334554; price = price.toStringAsFixed(2); print(price); // 99.01
To jest odniesienie do rzutki. ref: https://api.dartlang.org/stable/2.3.0/dart-core/num/toStringAsFixed.html
źródło
void main() { int decimals = 2; int fac = pow(10, decimals); double d = 1.234567889; d = (d * fac).round() / fac; print("d: $d"); }
Wydruki: 1.23
źródło
Aby zaokrąglić podwójną w Dart do określonego stopnia dokładności PO przecinku, możesz użyć wbudowanego rozwiązania w
toStringAsFixed()
metodzie rzutki , ale musisz przekonwertować to z powrotem na podwójnevoid 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 }
źródło
Zdefiniuj rozszerzenie:
extension Ex on double { double toPrecision(int n) => double.parse(toStringAsFixed(n)); }
Stosowanie:
void main() { double d = 2.3456789; double d1 = d.toPrecision(1); // 2.3 double d2 = d.toPrecision(2); // 2.35 double d3 = d.toPrecision(3); // 2.345 }
źródło
Zmodyfikowana odpowiedź @andyw przy użyciu metod Dart Extension:
extension Precision on double { double toPrecision(int fractionDigits) { double mod = pow(10, fractionDigits.toDouble()); return ((this * mod).round().toDouble() / mod); } }
Stosowanie:
var latitude = 1.123456; var latitudeWithFixedPrecision = latitude.toPrecision(3); // Outputs: 1.123
źródło
Możesz użyć
toStringAsFixed
, aby wyświetlić ograniczone cyfry po przecinku.toStringAsFixed
zwraca reprezentację ciągu w postaci punktu dziesiętnego.toStringAsFixed
akceptuje argument o nazwie,fraction Digits
który określa, ile cyfr po przecinku chcemy wyświetlić. Oto jak z niego korzystać.double pi = 3.1415926; const val = pi.toStringAsFixed(2); // 3.14
źródło
Zastosowałem
toStringAsFixed()
metodę, aby zaokrąglić liczbę do określonych liczb po przecinku EX:double num = 22.48132906
a kiedy zaokrągliłem to do dwóch liczb w ten sposób:
print(num.toStringAsFixed(2)) ;
Wydrukowano
22.48
a kiedy zaokrągliłem do jednej liczby, zostało wydrukowane
22.5
źródło
Powyższe rozwiązania nie sprawdzają się we wszystkich przypadkach. To, co zadziałało w moim problemie, to takie rozwiązanie, które zaokrągli twoją liczbę (0,5 do 1 lub 0,49 do 0) i pozostawi bez żadnych miejsc po przecinku :
Wejście: 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);
Wyjście: 13
Ten link ma również inne rozwiązania
źródło
Jeśli nie chcesz żadnych miejsc dziesiętnych, gdy wynikowe liczby dziesiętne są zerami, zadziała coś takiego:
String fixedDecimals(double d, int decimals, {bool removeZeroDecimals = true}){ double mod = pow(10.0, decimals); double result = ((d * mod).round().toDouble() / mod); if( removeZeroDecimals && result - (result.truncate()) == 0.0 ) decimals = 0; return result.toStringAsFixed(decimals); }
Spowoduje to po prostu wyświetlenie
9
zamiast,9.00
jeśli dane wejściowe to9.004
i chcesz, aby były to 2 miejsca po przecinku.źródło
Działa to całkiem nieźle
var price=99.012334554 price = price.roundTodouble(); print(price); // 99.01
źródło