Dart'ta bir ikiliyi ondalık noktadan SONRA belirli bir hassasiyet derecesine nasıl yuvarlarsınız?


111

Bir çift verildiğinde , PHP'nin round () işlevine benzer şekilde , ondalık noktadan sonra onu belirli bir hassasiyet noktasına yuvarlamak istiyorum.

Ben Dart dokümanlarında bulabilirsiniz yakın şey double.toStringAsPrecision () 'dir, ancak bu rakamları içerdiğinden neye ihtiyacım oldukça değildir önce hassasiyet toplam noktalarında ondalık noktasının.

Örneğin, toStringAsPrecision (3) kullanarak:

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

Sayının büyüklüğü arttıkça, ondalık basamaktan sonra buna bağlı olarak kesinliği kaybediyorum.

Yanıtlar:


193

Num.toStringAsFixed () için belgelere bakın .

String toStringAsFixed (int fractionDigits)

Bunun ondalık noktalı dize temsilini döndürür.

Dize gösterimini hesaplamadan önce bunu ikiye çevirir.

  • Bunun mutlak değeri 10 ^ 21'e eşitse veya bu değere eşitse, bu yöntem this.toStringAsExponential () tarafından hesaplanan üstel bir gösterim döndürür .

Örnekler:

1000000000000000000000.toStringAsExponential(3); // 1.000e+21
  • Aksi takdirde, sonuç, ondalık noktadan sonra tam olarak kesirDigits basamaklar içeren en yakın dize gösterimidir. FractionDigits 0'a eşitse, ondalık nokta atlanır.

FractionDigits parametresi şu tatmin edici bir tamsayı olmalıdır: 0 <= fractionDigits <= 20.

Örnekler:

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

Kabul edilen + Referans + Açıklama + Örnek olmalıdır
Kohls

1
Tutarsızlığı nedeniyle kullanılacak yuvarlama yönteminin toStringAsFixed () olduğunu iddia ediyorum. Örneğin, deneyin5.550.toStringAsFixed(1)
brendan

Ayrıca 0 haneye yuvarlarken dikkat edin, çünkü ifade bu durumda inta yerine an döndürür, doubleörneğin num.parse(50.123.toStringAsFixed(0)) is int- bu .toDouble(), sonuna eklenerek düzeltilebilir .
abulka

62

num.toStringAsFixed () turları. Bu, num (n) 'yi istediğiniz ondalık sayıya (2) sahip bir dizeye dönüştürür ve ardından onu tatlı bir kod satırında tekrar numaranıza ayrıştırır:

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

6
Bunu yapmanın en hızlı yolu bu. Ancak dartın bunu yapmanın doğrudan bir yolu olmaması aptalca
ThinkDigital

1
Uzatma yöntemi: extension NumberRounding on num { num toPrecision(int precision) { return num.parse((this).toStringAsFixed(precision)); } }
Vit Veres

27

Yukarıdaki çözümler sayıları uygun şekilde yuvarlamaz. Kullanırım:

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

Doğrulandı, bu , @brendan'ın işaret ettiği gibi biraz yanlış bir cevap veren en popüler cevabın aksine dp(5.550, 1)doğru bir şekilde yuvarlanıyor. 5.65.5
abulka

Dp için çalışmıyor (73.4750, 2) 73.48 yerine 73.47 döndürüyor calculatorsoup.com/calculators/math/… bu bağlantıyı kontrol edin
Deep Shah

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

Baskılar: 1.23


1
Bunu yapmanın en güncel yolu budur. 0,01 gibi kendi başına bir çift olmayan bir kesinliğe yuvarlama önemsiz değildir. Sonuç, çift olarak bile gösterilemez. Ondalık kesinliğin önemli olduğu her şey için (örneğin para gibi) tamsayı kullanmanızı şiddetle tavsiye ederim.
lrn

1
Ayrıca, js'ye derleme yapıyorsanız, Dart tam sayılarının da hassasiyeti kaybetmeye başlayacağını ve aşağıdaki gibi bir paket kullanmanız gerekeceğini belirtmek gerekir: pub.dartlang.org/packages/bignum
Greg Lowe

Bu yöntem, bunu yapmanın en iyi ve en zarif yolu gibi geliyor.
Giovanni



13

Dart'taki bir ikiliyi ondalık noktadan SONRA belirli bir hassasiyet derecesine yuvarlamak için, dart toStringAsFixed()yönteminde yerleşik çözümü kullanabilirsiniz , ancak onu tekrar ikiye dönüştürmeniz gerekir

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
}


9

Dart Uzantısı yöntemlerini kullanarak @andyw'in değiştirilmiş yanıtı:

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

Kullanım:

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

8

toStringAsFixedOndalık basamaklardan sonra sınırlı basamakları görüntülemek için kullanabilirsiniz . toStringAsFixedondalık noktalı bir dize temsilini döndürür. ondalık sayıdan sonra görüntülemek istediğimiz sayı olan toStringAsFixedbir argümanı kabul eder fraction Digits. İşte nasıl kullanılacağı.

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

6

Bir uzantı tanımlayın:

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

Kullanım:

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

EX ondalık noktadan sonra sayıyı belirli sayılara yuvarlamak için toStringAsFixed () yöntemini kullandım: double num = 22.48132906 ve bunun gibi iki sayıya yuvarladığımda: print (num.toStringAsFixed (2);

22.48 yazdırdı

ve bir sayıya yuvarladığımda .. 22,5 yazdırdı


2

Yukarıdaki çözümler her durumda işe yaramaz. Benim sorunum için işe yarayan, sayınızı (0,5'ten 1'e veya 0,49'dan 0'a) yuvarlayacak ve ondalık sayılar olmadan bırakacak bu çözümdü :

Giriş: 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);

Çıktı: 13

Bu bağlantının başka çözümleri de var


-5

Bu oldukça iyi çalışıyor

var price=99.012334554
price = price.roundTodouble();
print(price); // 99.01
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.