Làm thế nào để bạn làm tròn một đôi trong Dart đến một mức độ chính xác nhất định SAU dấu thập phân?


111

Với một nhân đôi, tôi muốn làm tròn nó thành một số điểm chính xác nhất định sau dấu thập phân , tương tự như hàm round () của PHP.

Điều gần nhất mà tôi có thể tìm thấy trong tài liệu Dart là double.toStringAsPre precision (), nhưng đây không phải là thứ tôi cần vì nó bao gồm các chữ số trước dấu thập phân trong tổng số điểm chính xác.

Ví dụ, bằng cách sử dụng toStringAsPre precision (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

Khi độ lớn của số tăng lên, tôi tương ứng mất độ chính xác sau chữ số thập phân.

Câu trả lời:


193

Xem tài liệu về num.toStringAsFixed () .

Chuỗi toStringAsFixed (int fractionDigits)

Trả về biểu diễn chuỗi-dấu chấm thập phân của giá trị này.

Chuyển đổi giá trị này thành giá trị kép trước khi tính toán biểu diễn chuỗi.

  • Nếu giá trị tuyệt đối của giá trị này lớn hơn hoặc bằng 10 ^ 21 thì phương thức này trả về một biểu diễn hàm mũ được tính bởi this.toStringAsExponential () .

Ví dụ:

1000000000000000000000.toStringAsExponential(3); // 1.000e+21
  • Nếu không, kết quả là biểu diễn chuỗi gần nhất với chính xác các chữ số fractionDigits sau dấu thập phân. Nếu fractionDigits bằng 0 thì dấu thập phân bị bỏ qua.

Tham số fractionDigits phải là một số nguyên thỏa mãn: 0 <= fractionDigits <= 20.

Ví dụ:

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

Phải là + Tài liệu tham khảo + Giải thích + Ví dụ được chấp nhận
Kohls

1
Tôi lập luận là toStringAsFixed () là phương thức làm tròn để sử dụng do tính không nhất quán của nó. Ví dụ: hãy thử5.550.toStringAsFixed(1)
brendan

Ngoài ra, hãy chú ý khi làm tròn đến 0 vị trí vì biểu thức trả về một intthay vì a doubletrong một trường hợp, ví dụ num.parse(50.123.toStringAsFixed(0)) is int- điều này có thể được sửa bằng cách thêm .toDouble()vào cuối biểu thức.
abulka

62

num.toStringAsFixed () vòng. Điều này biến bạn num (n) thành một chuỗi với số lượng số thập phân mà bạn muốn (2), và sau đó phân tích cú pháp nó trở lại num của bạn trong một dòng mã ngọt ngào:

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

6
Đó là cách nhanh nhất để làm điều đó. Nhưng đó là câm mà phi tiêu không có một cách trực tiếp để thực hiện điều này
ThinkDigital

1
Phương thức mở rộng: extension NumberRounding on num { num toPrecision(int precision) { return num.parse((this).toStringAsFixed(precision)); } }
Vit Veres

27

Các giải pháp trên không làm tròn số một cách thích hợp. Tôi sử dụng:

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

Đã xác nhận, điều này làm tròn dp(5.550, 1)chính xác 5.6- không giống như câu trả lời phổ biến nhất đưa ra một câu trả lời hơi sai 5.5như @brendan đã chỉ ra.
abulka

Không làm việc cho dp (73,4750, 2) Nó trả 73,47 thay vì 73,48 calculatorsoup.com/calculators/math/... kiểm tra liên kết này
Sâu Shah

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

Bản in: 1.23


1
Đây là cách tốt nhất hiện tại để làm điều này. Làm tròn đến độ chính xác như 0,01, bản thân nó không phải là một gấp đôi, không phải là tầm thường. Kết quả thậm chí có thể không được biểu diễn dưới dạng kép. Tôi thực sự khuyên bạn nên sử dụng số nguyên cho bất kỳ thứ gì mà độ chính xác thập phân là quan trọng (chẳng hạn như tiền).
LRN

1
Cũng đáng lưu ý rằng nếu biên dịch sang js, thì số nguyên Dart cũng sẽ bắt đầu mất độ chính xác và bạn sẽ cần sử dụng một gói như: pub.dartlang.org/packages/bignum
Greg Lowe

Phương pháp này có vẻ như là cách tốt nhất và thanh lịch nhất hiện tại để làm điều này.
Giovanni

đôi không thể được gán cho lỗi int xảy ra tại dòng 3
Gayan Pathirage


13

Để làm tròn một đôi trong Dart đến một mức độ chính xác nhất định SAU dấu thập phân, bạn có thể sử dụng giải pháp tích hợp trong toStringAsFixed()phương pháp phi tiêu , nhưng bạn phải chuyển đổi nó trở lại thành đôi

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
}


8

Câu trả lời được sửa đổi của @andyw bằng cách sử dụng các phương pháp Dart Extension:

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

Sử dụng:

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

7

Bạn có thể sử dụng toStringAsFixedđể hiển thị các chữ số giới hạn sau dấu thập phân. toStringAsFixedtrả về biểu diễn chuỗi-dấu chấm thập phân. toStringAsFixedchấp nhận một đối số được gọi là fraction Digitscó bao nhiêu chữ số sau số thập phân mà chúng tôi muốn hiển thị. Đây là cách sử dụng nó.

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

6

Xác định phần mở rộng:

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

Sử dụng:

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
}

2

Tôi đã sử dụng phương thức toStringAsFixed () để làm tròn số thành các số cụ thể sau dấu thập phân EX: double num = 22,48132906 và khi tôi làm tròn thành hai số như sau: print (num.toStringAsFixed (2);

nó được in 22,48

và khi tôi làm tròn thành một số .. in ra 22,5


2

Các giải pháp trên không hoạt động cho tất cả các trường hợp. Điều hiệu quả cho vấn đề của tôi là giải pháp này sẽ làm tròn số của bạn (0,5 thành 1 hoặc 0,49 thành 0) và không có bất kỳ số thập phân nào :

Đầu vào: 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);

Đầu ra: 13

Liên kết này cũng có các giải pháp khác


-4

Điều này hoạt động khá tốt

var price=99.012334554
price = price.roundTodouble();
print(price); // 99.01
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.