बिगडेसिमल को * हमेशा * पर गोल करने पर दो दशमलव स्थान होते हैं


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 का उपयोग करेंगे
गिल्बर्ट ले ब्लैंक

जवाबों:


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

19
यह वास्तव में काम करता है कि मैं कैसे चाहता हूं। क्या अंतर केवल वह है जो दशमलव round()अंकों की setScaleएक निश्चित संख्या के साथ काम करते समय महत्वपूर्ण अंकों के साथ काम करता है या इसमें और भी बहुत कुछ है?
ब्रैड मेस

44
"टाइपिंग राउंडिंग" करने के लिए RoundingMode.HALF_UP का उपयोग करें। वह 1.111 देता है 1.11 [CEILING देता है 1.12]
ग्रेज़गोरज़ देव

5
के लिए धन्यवाद RoundingMode.HALF_UP। प्रलेखन के अनुसार यह आमतौर पर स्कूलों में पढ़ाई जाने वाली गोलाई पद्धति है - जिसकी मुझे आवश्यकता थी।
रजत

1
ध्यान रखें यदि आपके मूल्य एक लेखांकन अनुप्रयोग में नकारात्मक हो सकते हैं। आपको CEILING के बजाय RoundingMode.UP का उपयोग करने की आवश्यकता हो सकती है
Dale

1
setScale(...)काम क्यों करता है ? देख BigDecimal setScale और दौर
जेसन लॉ
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.