web-dev-qa-db-ja.com

BigDecimalを整数値に切り上げる

値が450.90のBigDecimalがあります。次の穴の整数値に切り上げてから、次のように小数点なしで整数値を出力します。

値:450.90->四捨五入:451.00->出力:451

値:100.00001->丸め:101.00000出力:101

いくつかの解決策をチェックしましたが、期待した結果が得られません。これが私のコードです。

BigDecimal value = new BigDecimal(450.90);
value.setScale(0, RoundingMode.HALF_UP); //Also tried with RoundingMode.UP
return value.intValue();

ありがとう!

20

setScalereturns結果の新しいBigDecimal、それは変更されませんそれを呼び出すインスタンス。したがって、戻り値をvalueに割り当てます。

value = value.setScale(0, RoundingMode.UP);

実例

alwaysは切り上げたいと言ったので、これをRoundingMode.UPに変更しました。ただし、必要に応じて、代わりにRoundingMode.CEILINGを使用することもできます。 -451.2を何にしたいかによって異なります(-452 [UP]または-451 [CEILING])。詳細は RoundingMode を参照してください。

39
T.J. Crowder

使用する:

value.setScale(0, RoundingMode.CEILING);
4
przemek hertel

メソッドの説明から:

BigDecimalオブジェクトは不変なので、setScaleメソッドを呼び出しても、setX mutateフィールドXという名前のメソッドを持つという通常の規則に反して、元のオブジェクトが変更されることはありません。代わりに、setScaleは適切なスケールを持つオブジェクトを返します。返されたオブジェクトは、新しく割り当てられる場合とされない場合があります。

public void test() {
  BigDecimal value = new BigDecimal(450.90);
  System.out.println(value.setScale(0, RoundingMode.HALF_UP)); // prints 451
}
2
Fire

戻り値を使用する必要があります

BigDecimal value = new BigDecimal(450.90);
value = value.setScale(0, RoundingMode.HALF_UP); //Also tried with RoundingMode.UP

BigDecimal は不変であることに注意してください

スケーリング/丸め操作(setScaleおよびround)は、値がオペランドの値とほぼ(または正確に)等しいが、スケールまたは精度が指定された値であるBigDecimalを返します。つまり、値への影響を最小限に抑えて、格納された数値の精度を増減します。

1
venergiac

Math.ceil()関数を使用します。メソッドceilは、引数以上の最小の整数を提供します。

あなたはそれについて読むことができます ここ

0
starvator