मुझे निम्नलिखित परिणाम चाहिए
100.12 -> 100.00
100.44 -> 100.00
100.50 -> 101.00
100.75 -> 101.00
.round()
या .setScale()
? यह कैसे करना है?
जवाबों:
आप setScale()
भिन्नात्मक अंकों की संख्या को शून्य तक कम करने के लिए उपयोग कर सकते हैं । मान लिया जाता value
है कि मूल्य गोल है:
BigDecimal scaled = value.setScale(0, RoundingMode.HALF_UP);
System.out.println(value + " -> " + scaled);
उपयोग करना round()
थोड़ा अधिक शामिल है क्योंकि आपको बनाए रखने के लिए अंकों की संख्या निर्दिष्ट करने की आवश्यकता होती है। आपके उदाहरणों में यह 3 होगा, लेकिन यह सभी मूल्यों के लिए मान्य नहीं है:
BigDecimal rounded = value.round(new MathContext(3, RoundingMode.HALF_UP));
System.out.println(value + " -> " + rounded);
(ध्यान दें कि BigDecimal
वस्तुओं अपरिवर्तनीय हैं, दोनों setScale
और round
एक नई वस्तु वापस आ जाएगी।)
BigDecimal bd1 = new BigDecimal(100.12); BigDecimal bd2 = bd1.setScale(0, RoundingMode.HALF_UP); System.out.println(bd1.equals(bd2));
झूठा छापता है
RoundingMode
वो क्या है? यहBigDecimal
अगर मैं ग्रोड्रिग्ज के जवाब से जाऊं
System.out.println("" + value);
value = value.setScale(0, BigDecimal.ROUND_HALF_UP);
System.out.println("" + value);
यह आउटपुट है
100.23 -> 100
100.77 -> 101
जो काफी नहीं है जो मैं चाहता हूं, इसलिए मैंने यह करना समाप्त कर दिया।
System.out.println("" + value);
value = value.setScale(0, BigDecimal.ROUND_HALF_UP);
value = value.setScale(2, BigDecimal.ROUND_HALF_UP);
System.out.println("" + value);
यही मुझे मिलता है
100.23 -> 100.00
100.77 -> 101.00
यह अब के लिए मेरी समस्या को हल करता है ..:) आप सभी को धन्यवाद।
DecimalFormat
(के रूप में new DecimalFormat("###.00")
) उपयोग कर सकते हैं BigDecimal
। यह "101.00"
दोनों मानों के लिए परिणाम देता है जो @Grodriquez और आपके द्वारा बनाए गए स्निपेट्स हैं।
यहाँ एक भयानक जटिल समाधान है, लेकिन यह काम करता है:
public static BigDecimal roundBigDecimal(final BigDecimal input){
return input.round(
new MathContext(
input.toBigInteger().toString().length(),
RoundingMode.HALF_UP
)
);
}
टेस्ट कोड:
List<BigDecimal> bigDecimals =
Arrays.asList(new BigDecimal("100.12"),
new BigDecimal("100.44"),
new BigDecimal("100.50"),
new BigDecimal("100.75"));
for(final BigDecimal bd : bigDecimals){
System.out.println(roundBigDecimal(bd).toPlainString());
}
आउटपुट:
100
100
101
101
input.toBigInteger().toString().length()
एक लघुगणक का उपयोग करके भाग अधिक कुशल होगा, कुछ बात जैसेround_up(log(input)) + (1 if input is a power of ten, else 0)
बस देखो:
http://download.oracle.com/javase/6/docs/api/java/math/BigDecimal.html#ROUND_HALF_UP
तथा:
setScale(int precision, int roundingMode)
या अगर जावा 6 का उपयोग कर रहे हैं, तो
http://download.oracle.com/javase/6/docs/api/java/math/RoundingMode.html#HALF_UP
http://download.oracle.com/javase/6/docs/api/java/math/MathContext.html
और या तो:
setScale(int precision, RoundingMode mode);
round(MathContext mc);
मुझे नहीं लगता कि आप इसे एक ही कमांड में राउंड कर सकते हैं। प्रयत्न
ArrayList<BigDecimal> list = new ArrayList<BigDecimal>();
list.add(new BigDecimal("100.12"));
list.add(new BigDecimal("100.44"));
list.add(new BigDecimal("100.50"));
list.add(new BigDecimal("100.75"));
for (BigDecimal bd : list){
System.out.println(bd+" -> "+bd.setScale(0,RoundingMode.HALF_UP).setScale(2));
}
Output:
100.12 -> 100.00
100.44 -> 100.00
100.50 -> 101.00
100.75 -> 101.00
मैंने आपके बाकी उदाहरणों के लिए परीक्षण किया और यह वांछित मूल्यों को लौटाता है, लेकिन मैं इसकी शुद्धता की गारंटी नहीं देता।
तुम्हें चाहिए
round(new MathContext(0)); // or perhaps another math context with rounding mode HALF_UP
round
: "यदि सटीक सेटिंग 0 है तो कोई राउंडिंग नहीं होती है।"