Как вы удвоитесь в Дарте до определенной степени точности ПОСЛЕ десятичной точки?

Учитывая двойной, я хочу округлить его до заданного числа точек точности после десятичной точки, аналогично функции PHP round().

Ближайшая вещь, которую я могу найти в Dart docs, - double.toStringAsPrecision(), но это не совсем то, что мне нужно, потому что она включает в себя цифры до десятичной точки в общих точках точности.

Например, используя 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

Поскольку величина числа увеличивается, я соответственно теряю точность после десятичной точки.

Ответ 1

Смотрите документы для num.toStringAsFixed().

Строка toStringAsFixed (int fractionDigits)

Возвращает строковое представление десятичной точки.

Преобразует это значение в double перед вычислением строкового представления.

Если абсолютное значение этого значения больше или равно 10 ^ 21, тогда эти методы возвращают экспоненциальное представление, вычисленное this.toStringAsExponential(). В противном случае результат будет самым близким строковым представлением с точно дробными числами цифр после десятичной точки. Если fractionDigits равно 0, то десятичная точка опущена.

Параметр fractionDigits должен быть целым числом, удовлетворяющим: 0 <= fractionDigits <= 20.

Примеры:

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

Ответ 2

num.toStringAsFixed() раундов. Это превращает вас num (n) в строку с количеством десятичных знаков, которое вы хотите (2), а затем анализирует его до вашего номера в одной сладкой строке кода:

n = num.parse(n.toStringAsFixed(2));

Ответ 3

void main() {
  int decimals = 2;
  int fac = pow(10, decimals);
  double d = 1.234567889;
  d = (d * fac).round() / fac;
  print("d: $d");
}

Печать: 1,23

Ответ 4

Вышеуказанные решения не округляют числа. Я использую:

double dp(double val, int places){ 
   double mod = pow(10.0, places); 
   return ((val * mod).round().toDouble() / mod); 
}