1前書き

このチュートリアルでは、

double

値を

String

に変換し、小数点以下の桁数を削除する** さまざまな方法を見ていきます。

小数部分を切り捨てるときと丸めるときの方法を見てみましょう。


2キャスティングを使用した打ち切り


double

の値が

int

の範囲内であれば、



int




__にキャストすることができます。

__キャストは小数部を切り捨てます。つまり、丸めは行われずに切り捨てられます。

  • このアプローチは、他のアプローチの約10倍の速さです。

それが

int、


になったら、それを

String

クラス



valueOf

メソッド


に渡します。

String truncated = String.valueOf((int) doubleValue);


double値が

int


の範囲内であることが保証されている場合は、このアプローチを自信を持って使用できます。しかし、

私たちの価値がそれを超えると、キャスティングは私たちが望んでいたようにはうまくいきません


3

String.format()を使用した丸め


今、残りのアプローチはキャスティングほど制限されていません、しかし彼らは彼ら自身のニュアンスを持っています。

たとえば、もう1つの方法は、

String

クラスの

format

メソッドを使用することです。メソッドの最初のパラメータは、浮動小数点値を小数点以下0桁でフォーマットすることを指定します。

String rounded = String.format("%.0f", doubleValue);


  • format

    メソッドは

    __HALF

    UP ____rounding ** を使用します。これは、小数部分の後の値が0.5以上の場合に切り上げます。それ以外の場合は、小数点の前の数値を返します。

そして簡単ですが、


String.format



がこれを行う最も遅い方法です


4

NumberFormat.format()


を使用する


NumberFormat

クラスは

String

クラスに似た

format

メソッドも提供しますが、**

__ NumberFormat

__は高速であり、それを使用して丸めモードを指定して切り捨てまたは丸めを行うことができます。


setMaximumFractionDigits()

メソッドは、出力に含める小数点以下の桁数をフォーマッタに指示します。

NumberFormat nf = NumberFormat.getNumberInstance();
nf.setMaximumFractionDigits(0);
String rounded = nf.format(doubleValue);

  • 奇妙なことに、

    NumberFormat

    はデフォルトで

    HALF

    UP__を使用しません。


  • HALF

    EVEN

    は統計分析に役立ちますが、** 一貫性を保つために

    HALF

    UP

    を使用しましょう。

nf.setRoundingMode(RoundingMode.HALF__UP);
String rounded = nf.format(doubleValue);

そして、** これを変更して、代わりに

FLOOR

丸めモードを使用するようにフォーマッタを設定することによって切り捨てを達成することができます。

nf.setRoundingMode(RoundingMode.FLOOR);
String truncated = nf.format(doubleValue)

そして今、それは丸めの代わりに切り捨てられます。


5

DecimalFormat.format()


を使用する


NumberFormat

と同様に、

DecimalFormat

クラスを使用して

double

値をフォーマットできます。しかし、メソッド呼び出しで出力フォーマットを設定する代わりに、コンストラクタに特定のパターンを与えることで、フォーマッタにどのような出力が欲しいかを伝えることができます。

DecimalFormat df = new DecimalFormat("#,###");
df.setRoundingMode(RoundingMode.HALF__UP);
String rounded = df.format(doubleValue);

“#、

#

”パターンは、フォーマッタが入力の整数部分だけを返すようにしたいことを意味します。また、数字を3つにまとめてカンマで区切ってもらいたいことを知らせます。

ここで同じ丸めのデフォルトが適用されるので、切り捨てた値を出力したい場合は丸めモードを

FLOOR

に設定できます。

df.setRoundingMode(RoundingMode.FLOOR);
String truncated = df.format(doubleValue)


6.

BigDecimal.toString()


を使用する

最後のアプローチは

BigDecimal

です。これは、大きい

__double


に対して**

NumberFormat



DecimalFormat__を上回るパフォーマンスを発揮するためです。

丸めるか切り捨てるかを判断するには、

BigDecimal

‘s

__setScale

__methodを使用します。

double largeDouble = 345__345__345__345.56;
BigDecimal big = new BigDecimal(largeDouble);
big = big.setScale(0, RoundingMode.HALF__UP);


__BigDecimal

__は不変であることを忘れないでください。文字列のように、値をリセットする必要があります。

それから、

BigDecimal

´s

toString

を呼び出します。

String rounded = big.toString();


7. 結論

このチュートリアルでは、小数点以下の桁数を削除しながら

double



String

に変換する方法を調べました。

いつものように、サンプルとベンチマークはhttps://github.com/eugenp/tutorials/tree/master/core-java[GitHubに追加]から入手できます。