การปัด BigDecimal เป็น * always * มีทศนิยมสองตำแหน่ง


217

ฉันพยายามปัดเศษ BigDecimal ให้เป็นทศนิยมสองตำแหน่ง

ฉันกำลังใช้

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

ฉันไม่สนใจตัวเลขที่สำคัญฉันแค่ต้องการทศนิยมสองตำแหน่ง ฉันจะทำสิ่งนี้กับ BigDecimal ได้อย่างไร หรือมีคลาส / ไลบรารีอื่นที่เหมาะสมกับสิ่งนี้มากกว่าหรือไม่?


9
หากคุณต้องการปัดเศษคุณจะต้องใช้ RoundingMode.HALF_UP
Gilbert Le Blanc

คำตอบ:


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

19
มันทำงานได้อย่างที่ฉันต้องการ ความแตกต่างง่ายๆที่round()ทำงานกับตัวเลขที่สำคัญในขณะที่setScaleทำงานกับจำนวนทศนิยมคงที่หรือมากกว่านั้น?
แบรดคทา

44
ใช้ RoundingMode.HALF_UP เพื่อทำ "การปัดเศษ typcal" นั่นคือ 1.111 ให้ 1.11 [การให้ CEIL 1.12]
Grzegorz Dev

5
RoundingMode.HALF_UPขอบคุณสำหรับ ตามเอกสารมันเป็นวิธีการปัดเศษสอนโดยทั่วไปในโรงเรียน - สิ่งที่ฉันต้องการ
เงิน

1
ระวังว่าค่าของคุณอาจเป็นลบเช่นเดียวกับในแอปพลิเคชันการบัญชี คุณอาจต้องใช้ RoundingMode.UP แทน CEILING
Dale

1
ทำไมถึงsetScale(...)ทำงาน ดูBigDecimal setScale และรอบ
Jason Law
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.