BigDecimalを*常に*に丸めると、小数点以下2桁になります


217

BigDecimal値を小数点以下2桁に切り上げようとしています。

私は使っています

BigDecimal rounded = value.round(new MathContext(2, RoundingMode.CEILING));
logger.trace("rounded {} to {}", value, rounded);

しかし、それは私が一貫して望むことをしません:

rounded 0.819 to 0.82
rounded 1.092 to 1.1
rounded 1.365 to 1.4 // should be 1.37
rounded 2.730 to 2.8 // should be 2.74
rounded 0.819 to 0.82

有効数字は気にせず、小数点以下2桁にしたいだけです。BigDecimalでこれを行うにはどうすればよいですか?または、これにより適した別のクラス/ライブラリはありますか?


9
実際に丸めたい場合は、RoundingMode.HALF_UPを使用します
Gilbert Le Blanc

回答:


401
value = value.setScale(2, RoundingMode.CEILING)

19
それは確かに私が望む方法で機能します。小数点以下の桁数が固定されてround()いても有効桁数で機能するだけの違いsetScaleですか、それともそれ以上ですか?
Brad Mace 2013年

44
RoundingMode.HALF_UPを使用して、「通常の丸め」を行います。つまり、1.111は1.11を与えます[CEILINGは1.12を与えます]
Grzegorz Dev

5
をありがとうRoundingMode.HALF_UP。ドキュメンテーションによると、それは学校で一般的に教えられている丸め方法です-私が必要とするものです。
シルバー

1
会計アプリケーションのように、値が負になる可能性がある場合は注意してください。CEILINGの代わりにRoundingMode.UPを使用する必要があるかもしれません
Dale

1
なぜ機能するのsetScale(...)ですか?BigDecimal setScaleおよびroundを参照してください。
Jason Law、
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.