ダートのdoubleを小数点以下の精度でどのように丸めますか?


111

doubleが与えられた場合、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

数の大きさが増すにつれて、それに応じて小数点以下の精度が失われます。

回答:


193

num.toStringAsFixed()のドキュメントを参照してください。

文字列toStringAsFixed(intfractionDigits)

これを表す小数点文字列を返します。

文字列表現を計算する前に、これをdoubleに変換します。

  • これの絶対値が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

受け入れられる必要があります+参照+説明+例
コールズ

1
toStringAsFixed()は、一貫性がないために使用する丸めメソッドであると私は主張します。たとえば、試してみてください5.550.toStringAsFixed(1)
ブレンダン

また、0桁に丸める場合は、式がintaではなくを返すので注意してください。doubleたとえば、num.parse(50.123.toStringAsFixed(0)) is intこれ.toDouble()は末尾に追加することで修正できます。
abulka

62

num.toStringAsFixed()ラウンド。これは、num(n)を必要な小数点以下の桁数(2)の文字列に変換し、それを1行の甘いコードでnumに解析して戻します。

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

6
それが最も簡単な方法です。しかし、ダーツがこれを直接行う方法を持っていないのは
ばかげ

1
拡張方法: extension NumberRounding on num { num toPrecision(int precision) { return num.parse((this).toStringAsFixed(precision)); } }
Vit Veres

27

上記のソリューションは、数値を適切に丸めません。私が使う:

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

それは73.48の代わりに73.47を返しDPための作業(73.4750、2)しない calculatorsoup.com/calculators/math/... 、このリンクをチェックアウト
ディープ・シャー

20
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
これは、これを行うための現在の最良の方法です。それ自体が2倍ではない0.01のような精度に丸めることは、簡単ではありません。結果は、doubleとして表現することさえできないかもしれません。小数の精度が重要なもの(たとえば、お金)には整数を使用することを強くお勧めします。
lrn 2015

1
また、jsにコンパイルすると、Dart整数も精度が低下し始め
Greg Lowe

この方法は、これを行うための現在の最良かつ最もエレガントな方法のように感じます。
ジョバンニ

ダブルをintに割り当てることはできませんエラーは3行目で発生します
GayanPathirage19年


13

Dartのdoubleを小数点以下の精度で丸めるには、darttoStringAsFixed()メソッドの組み込みソリューションを使用できますが、doubleに戻す必要があります。

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

Dart Extensionメソッドを使用した@andywの修正された回答:

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

7

toStringAsFixed小数点以下の制限桁数を表示するために使用できます。toStringAsFixed小数点文字列表現を返します。表示する小数点以下の桁数であるtoStringAsFixedという引数を受け入れfraction Digitsます。使い方はこちらです。

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

6

拡張機能を定義します。

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
}

2

toStringAsFixed()メソッドを使用して、小数点以下の特定の数値に数値を丸めましたEX:double num = 22.48132906そして次のように2つの数値に丸めた場合:print(num.toStringAsFixed(2);

22.48を印刷しました

そして私が1つの数に丸めたとき..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

このリンクには他の解決策もあります


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.