Як округлити дубль у Дарті до заданого ступеня точності ПІСЛЯ десяткової коми?


125

Отримавши дубль, я хочу округлити його до заданої кількості точок точності після десяткової коми , подібно до функції PHP Round ().

Найближче, що я можу знайти в документах Dart, це 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

Зі збільшенням величини числа я відповідно втрачаю точність після десяткової коми.

Відповіді:


208

Див. Документи для num.toStringAsFixed () .

Рядок toStringAsFixed (int fractionDigits)

Повертає це рядкове представлення з десятковою комою.

Перетворює це у подвійне значення перед обчисленням подання рядка.

  • Якщо абсолютне значення цього більше або дорівнює 10 ^ 21, тоді ці методи повертають експоненціальне подання, обчислене за допомогою this.toStringAsExponential () .

Приклади:

1000000000000000000000.toStringAsExponential(3); // 1.000e+21
  • В іншому випадку результат є найближчим рядковим поданням із точно цифрами fractionDigits після десяткової коми. Якщо 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

Повинно бути прийнято + Посилання + + Пояснення Приклад
Kohls

1
Я стверджую, що toStringAsFixed () використовується метод округлення через його непослідовність. Наприклад, спробуйте5.550.toStringAsFixed(1)
brendan

Також слідкуйте за округленням до 0 місць, оскільки вираз повертає intзамість a doubleу цьому випадку, наприклад num.parse(50.123.toStringAsFixed(0)) is int- це можна виправити, додавши .toDouble()в кінець.
abulka

67

num.toStringAsFixed()турів. Цей перетворює вас num (n) у рядок із потрібною кількістю десяткових знаків (2), а потім аналізує його назад до вашого num в одному солодкому рядку коду:

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

7
Це найшвидший спосіб це зробити. Але безглуздо, що у дартса немає прямого способу зробити це
ThinkDigital

1
Метод продовження: extension NumberRounding on num { num toPrecision(int precision) { return num.parse((this).toStringAsFixed(precision)); } }
Віт Верес

31

Наведені вище рішення не мають відповідного округлення цифр. Я використовую:

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

Підтверджено, це робить dp(5.550, 1)правильний перехід 5.6- на відміну від найпопулярнішої відповіді, яка дає трохи неправильну відповідь, 5.5як зазначив @brendan.
abulka

Не працює для dp (73.4750, 2) Він повертає 73.47 замість 73.48 calculatorsoup.com/calculators/math/... перевірте це посилання
Deep Shah


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

Відбитки: 1,23


1
Це найкращий сучасний спосіб зробити це. Округлення до точності 0,01, яка сама по собі не є дублем, не є тривіальною. Результат може взагалі не бути представленим як подвійний. Я настійно рекомендую використовувати цілі числа для будь-чого, де десяткова точність важлива (як, скажімо, гроші).
lrn

1
Також варто зазначити, що при компіляції в js цілі числа Дарта також почнуть втрачати точність, і вам потрібно буде використовувати такий пакет, як: pub.dartlang.org/packages/bignum
Грег Лоу

Цей метод виглядає як найкращий і найелегантніший спосіб зробити це зараз.
Джованні

double не може бути присвоєно int помилка трапляється у рядку 3
Gayan Pathirage

13

Щоб округлити дубль у Дарті до заданого ступеня точності ПІСЛЯ десяткової коми, ви можете використовувати вбудоване рішення toStringAsFixed()методом дротиків , але вам доведеться перетворити його назад на подвійне

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
}


11

Визначте розширення:

extension Ex on double {
  double toPrecision(int n) => double.parse(toStringAsFixed(n));
}

Використання:

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
}

10

Модифікована відповідь @andyw за допомогою методів Dart Extension:

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

Використання:

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

8

Ви можете використовувати toStringAsFixedдля відображення обмежених цифр після десяткових крапок. toStringAsFixedповертає подання рядка з десятковою комою. toStringAsFixedприймає аргумент, fraction Digitsякий називається, скільки цифр після десяткової коми ми хочемо відобразити. Ось як ним користуватися.

double pi = 3.1415926;
const val = pi.toStringAsFixed(2); // 3.14

4

Я використав toStringAsFixed()метод, щоб округлити число до конкретних чисел після десяткової коми EX:

double num = 22.48132906

і коли я округлив його до двох цифр так:

print(num.toStringAsFixed(2)) ;

Це надруковано 22.48

і коли я округлив до одного числа, воно надрукувалося 22.5


2

Вищевказані рішення працюють не у всіх випадках. Що допомогло моїй проблемі, це рішення, яке округлить ваше число (0,5 до 1 або 0,49 до 0) і залишить його без десяткових знаків :

Вхід: 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);

Вихід: 13

Це посилання також має інші рішення


0

Якщо ви не хочете жодних десяткових знаків, коли отримані десяткові числа є нулями, щось подібне буде працювати:

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);
}

Це просто виведе 9замість того, 9.00якщо введення є, 9.004і ви хочете 2 знаки після коми.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.