जावा बिगडिमल: निकटतम पूरे मूल्य के लिए गोल


90

मुझे निम्नलिखित परिणाम चाहिए

100.12 -> 100.00
100.44 -> 100.00
100.50 -> 101.00
100.75 -> 101.00

.round()या .setScale()? यह कैसे करना है?

जवाबों:


153

आप 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एक नई वस्तु वापस आ जाएगी।)


1
यह काम नहीं कर रहा है: 100.12: 100.12, 100.44: 100.44, 100.50: 100.5, 100.75: 100.75
बोरिस पावलोव

3
नहीं, सेटिंग स्केल एक नया दशमलव देता है जो पहले जैसा नहीं है। उदाहरण के लिए: BigDecimal bd1 = new BigDecimal(100.12); BigDecimal bd2 = bd1.setScale(0, RoundingMode.HALF_UP); System.out.println(bd1.equals(bd2));झूठा छापता है
डैनियल फथ

6
@ डैनियल: यह पहले से ही कोड स्निपेट में निहित था जिसे मैंने अपने उत्तर में पोस्ट किया था। मैंने अब इसे स्पष्ट कर दिया है।
ग्रोड्रिग्ज 14

RoundingModeवो क्या है? यहBigDecimal
त्रयी


10

अगर मैं ग्रोड्रिग्ज के जवाब से जाऊं

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

यह अब के लिए मेरी समस्या को हल करता है ..:) आप सभी को धन्यवाद।


7
मैं इस कथन के बारे में उत्सुक हूं कि पहला परिणाम "मैं जो चाहता हूं वह काफी नहीं है ..."। यदि आप वास्तव में आउटपुट स्वरूपण के बारे में चिंतित हैं, तो आप बैक टू स्ट्रिंग के रूपांतरण को प्रबंधित करने के लिए DecimalFormat(के रूप में new DecimalFormat("###.00")) उपयोग कर सकते हैं BigDecimal। यह "101.00"दोनों मानों के लिए परिणाम देता है जो @Grodriquez और आपके द्वारा बनाए गए स्निपेट्स हैं।
joel.neely

3
दूसरी बार जब आप यहां राउंडिंग कर रहे हैं तो अनावश्यक है क्योंकि आप जानते हैं कि आपके पास पहले से ही एक पूर्णांक है, इसलिए मैं इसके बजाय BigDecimal.ROUND_UNNECESSARY का उपयोग करूंगा, मेरी राय में थोड़ा और स्पष्ट।
कोसमोपलान

5

यहाँ एक भयानक जटिल समाधान है, लेकिन यह काम करता है:

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)
Addison

3

बस देखो:

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);

0

मुझे नहीं लगता कि आप इसे एक ही कमांड में राउंड कर सकते हैं। प्रयत्न

    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

मैंने आपके बाकी उदाहरणों के लिए परीक्षण किया और यह वांछित मूल्यों को लौटाता है, लेकिन मैं इसकी शुद्धता की गारंटी नहीं देता।


-2

तुम्हें चाहिए

round(new MathContext(0));  // or perhaps another math context with rounding mode HALF_UP

2
यह कुछ नहीं करता है। के प्रलेखन से round: "यदि सटीक सेटिंग 0 है तो कोई राउंडिंग नहीं होती है।"
ग्रोड्रिग्ज 13
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.