1. 序章

このチュートリアルでは、 double値をStringに変換し、小数点以下の桁数を削除するさまざまな方法。

小数部を切り捨てる場合と丸める場合の方法を見ていきます。

2. 鋳造を使用した切り捨て

私たちの場合ダブル値は int 範囲、私たちはできますそれをintにキャストします 。 キャストは小数部分を切り捨てます。つまり、丸めを行わずに小数部分を切り取ります。

このアプローチは、これから説明する他のアプローチの約10倍の速度です。

int、 になったら、StringクラスのvalueOfメソッドに渡すことができます。

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

double値がintの範囲内にあることが保証されている場合は、このアプローチを自信を持って使用できます。 しかし、値がそれを超えると、キャストは期待どおりに機能しません

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

現在、残りのアプローチはキャストほど制限されていませんが、独自のニュアンスがあります。

たとえば、別のアプローチは、Stringクラスのformatメソッドを使用することです。 メソッドの最初のパラメーターは、小数点以下0桁の浮動小数点値をフォーマットすることを指定します。

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

formatメソッドは、HALF_UP丸めを使用します。これは、小数部の後の値が.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 丸めを使用します。つまり、.5、を除いて、通常どおりに丸められます。最も近い偶数を選択します。

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です。これは、がNumberFormatおよびDecimalFormatよりも大きいdoublesよりも優れているために含まれます。

BigDecimalsetScaleメソッドを使用して、丸めるか切り捨てるかを判断できます。

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

BigDecimal は不変であるため、文字列と同様に、値をリセットする必要があることに注意してください。

次に、BigDecimaltoStringを呼び出すだけです。

String rounded = big.toString();

7. 結論

このチュートリアルでは、 小数点以下の桁数を削除しながら、doubleをStringに変換するさまざまな方法を検討しました。 丸められた値または切り捨てられた値のいずれかを出力するアプローチを提供しました。

いつものように、サンプルとベンチマークはGitHubから入手できます。