2015-02-09 4 views
7

Учитывая двойное, я хочу округлить его до заданного числа точек точности после десятичной точки, аналогично функции round() PHP.Как вы обходите двойник в Дарте с заданной степенью точности ПОСЛЕ десятичной точки?

Ближайшей вещь, которую я могу найти в документации дротика 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 

В качестве величины при увеличении числа, я, соответственно, теряет точность после десятичного знака.

ответ

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

Печать: 1,23

+0

Это лучший текущий способ сделай это. Округление до точности, как 0.01, которая сама по себе не является двойной, не является тривиальной. Результат может быть даже не представлен как двойной. Я настоятельно рекомендую использовать целые числа для чего-либо, где важна десятичная точность (например, деньги). – lrn

+1

Также стоит отметить, что если компилировать в js, то целые числа Dart также начнут терять точность, и вам нужно будет использовать пакет, например: https://pub.dartlang.org/packages/bignum –

10

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

Строка toStringAsFixed (INT fractionDigits)

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

Преобразовывает это в двойное, прежде чем вычислять представление строки.

Если абсолютное значение этого больше или равно 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 
123456789.toStringAsFixed(3); // 123456789.000 
1000000000000000000000.toStringAsFixed(3); // 1e+21 
5.25.toStringAsFixed(0); // 5 
2

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

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