DoubleをStringに変換し、小数点以下の桁数を削除します
1. 序章
このチュートリアルでは、
小数部を切り捨てる場合と丸める場合の方法を見ていきます。
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よりも優れているために含まれます。
BigDecimalのsetScaleメソッドを使用して、丸めるか切り捨てるかを判断できます。
double largeDouble = 345_345_345_345.56;
BigDecimal big = new BigDecimal(largeDouble);
big = big.setScale(0, RoundingMode.HALF_UP);
BigDecimal は不変であるため、文字列と同様に、値をリセットする必要があることに注意してください。
次に、BigDecimalのtoStringを呼び出すだけです。
String rounded = big.toString();
7. 結論
このチュートリアルでは、
いつものように、サンプルとベンチマークはGitHubでから入手できます。