BigDecimal'ı * always * olarak yuvarlamak iki ondalık basamağa sahip


217

BigDecimal değerleri iki ondalık basamağa yuvarlamaya çalışıyorum.

kullanıyorum

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

ama sürekli istediğimi yapmıyor:

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

Önemli basamakları umursamıyorum, sadece iki ondalık basamak istiyorum. Bunu BigDecimal ile nasıl yapabilirim? Yoksa buna daha uygun başka bir sınıf / kütüphane var mı?


9
Aslında yuvarlamak istiyorsanız, RoundingMode.HALF_UP kullanırsınız
Gilbert Le Blanc

Yanıtlar:


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

19
Gerçekten istediğim gibi çalışıyor. Fark sadece belirli sayıda ondalık round()basamakla çalışırken önemli basamaklarla setScaleçalışan mı yoksa daha fazlası mı var?
Brad Mace

44
"Tipik yuvarlama" yapmak için RoundingMode.HALF_UP kullanın. Bu 1.111 verir 1.11 [TAVAN 1.12 verir]
Grzegorz Dev

5
İçin teşekkürler RoundingMode.HALF_UP. Belgelere göre, okullarda yaygın olarak öğretilen yuvarlama yöntemidir - ihtiyacım olan şey.
gümüş

1
Bir muhasebe uygulamasında olduğu gibi değerlerinizin negatif olabileceğine dikkat edin. CEILING yerine
Dale

1
Neden setScale(...)çalışır? bkz. BigDecimal setScale ve round .
Jason Law
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.