खोज…


परिचय

BigDecimal वर्ग अंकगणित (जोड़, घटाना, गुणा, भाग), स्केल हेरफेर, गोलाई, तुलना, हैशिंग और प्रारूप रूपांतरण के लिए संचालन प्रदान करता है। BigDecimal अपरिवर्तनीय, मनमाना-सटीक हस्ताक्षरित दशमलव संख्याओं का प्रतिनिधित्व करता है। इस कक्षा का उपयोग उच्च-सटीक गणना की आवश्यकता में किया जाएगा।

BigDecimal ऑब्जेक्ट अपरिवर्तनीय हैं

यदि आप BigDecimal के साथ गणना करना चाहते हैं तो आपको लौटाए गए मान का उपयोग करना होगा क्योंकि BigDecimal ऑब्जेक्ट अपरिवर्तनीय हैं:

BigDecimal a = new BigDecimal("42.23");
BigDecimal b = new BigDecimal("10.001");

a.add(b); // a will still be 42.23

BigDecimal c = a.add(b); // c will be 52.231 

बिगडेकिमल्स की तुलना करना

BigDecimals तुलना करने के लिए Method compareTo का उपयोग किया जाना चाहिए:

BigDecimal a = new BigDecimal(5);
a.compareTo(new BigDecimal(0));    // a is greater, returns 1
a.compareTo(new BigDecimal(5));    // a is equal, returns 0
a.compareTo(new BigDecimal(10));   // a is less, returns -1

आमतौर पर आपको equals पद्धति का उपयोग नहीं करना चाहिए क्योंकि यह दो BigDecimals समान मानती है, यदि वे मूल्य में बराबर हैं और पैमाने पर भी हैं:

BigDecimal a = new BigDecimal(5);
a.equals(new BigDecimal(5));       // value and scale are equal, returns true
a.equals(new BigDecimal(5.00));    // value is equal but scale is not, returns false

BigDecimal के साथ गणितीय संचालन

इस उदाहरण से पता चलता है कि बिगडेकिमल्स का उपयोग करके बुनियादी गणितीय संचालन कैसे किया जाता है।

1.Addition

BigDecimal a = new BigDecimal("5");
BigDecimal b = new BigDecimal("7");

//Equivalent to result = a + b
BigDecimal result = a.add(b);
System.out.println(result);

परिणाम: 12

2.Subtraction

BigDecimal a = new BigDecimal("5");
BigDecimal b = new BigDecimal("7");

//Equivalent to result = a - b
BigDecimal result = a.subtract(b);
System.out.println(result);

परिणाम: -2

3.Multiplication

जब दो BigDecimal s को गुणा किया जाता है, तो परिणाम BigDecimal के माप के योग के बराबर होता है।

BigDecimal a = new BigDecimal("5.11");
BigDecimal b = new BigDecimal("7.221");

//Equivalent to result = a * b
BigDecimal result = a.multiply(b);
System.out.println(result);

परिणाम: 36.89931

परिणाम के पैमाने को बदलने के लिए ओवरलोड बहु विधि का उपयोग करें जो MathContext पारित करने की अनुमति देता है - ऑपरेटरों के लिए नियमों का वर्णन करने वाली एक वस्तु, विशेष रूप से परिणाम की परिशुद्धता और गोलाई मोड। उपलब्ध राउंडिंग मोड के बारे में अधिक जानकारी के लिए कृपया Oracle दस्तावेज़ीकरण देखें।

BigDecimal a = new BigDecimal("5.11");
BigDecimal b = new BigDecimal("7.221");

MathContext returnRules = new MathContext(4, RoundingMode.HALF_DOWN);

//Equivalent to result = a * b
BigDecimal result = a.multiply(b, returnRules);
System.out.println(result);

परिणाम: 36.90

4.Division

डिवीजन अन्य अंकगणितीय ऑपरेशनों की तुलना में थोड़ा अधिक जटिल है, उदाहरण के लिए नीचे दिए गए उदाहरण पर विचार करें:

BigDecimal a = new BigDecimal("5");
BigDecimal b = new BigDecimal("7");

BigDecimal result = a.divide(b);
System.out.println(result);

हम उम्मीद करेंगे कि यह कुछ इसी तरह दे: 0.7142857142857143, लेकिन हमें मिलेगा:

परिणाम: java.lang.ArithmeticException: गैर-समाप्ति दशमलव विस्तार; कोई सटीक प्रतिनिधित्व योग्य दशमलव परिणाम नहीं।

यह पूरी तरह से अच्छी तरह से काम करेगा जब परिणाम एक समाप्ति दशमलव कहेगा यदि मैं 5 को 2 से विभाजित करना चाहता था, लेकिन उन संख्याओं के लिए जो विभाजित करने पर एक गैर-समाप्ति परिणाम देगा, हमें एक ArithmeticException मिलेगा। वास्तविक दुनिया के परिदृश्य में, कोई भी उन मूल्यों की भविष्यवाणी नहीं कर सकता है जो विभाजन के दौरान सामने आएंगे, इसलिए हमें बिगडेसिमल डिवीजन के लिए स्केल और राउंडिंग मोड को निर्दिष्ट करने की आवश्यकता है। स्केल और राउंडिंग मोड के बारे में अधिक जानकारी के लिए Oracle डॉक्यूमेंटेशन देखें।

उदाहरण के लिए, मैं कर सकता था:

BigDecimal a = new BigDecimal("5");
BigDecimal b = new BigDecimal("7");

//Equivalent to result = a / b (Upto 10 Decimal places and Round HALF_UP)
BigDecimal result = a.divide(b,10,RoundingMode.HALF_UP);
System.out.println(result);

परिणाम: 0.7142857143

5. किरण या मापांक

BigDecimal a = new BigDecimal("5");
BigDecimal b = new BigDecimal("7");

//Equivalent to result = a % b
BigDecimal result = a.remainder(b);
System.out.println(result);

परिणाम: 5

6.Power

BigDecimal a = new BigDecimal("5");

//Equivalent to result = a^10    
BigDecimal result = a.pow(10);
System.out.println(result);

परिणाम: 9765625

7.Max

BigDecimal a = new BigDecimal("5");
BigDecimal b = new BigDecimal("7");

//Equivalent to result = MAX(a,b) 
BigDecimal result = a.max(b);
System.out.println(result);

परिणाम: 7

8.Min

BigDecimal a = new BigDecimal("5");
BigDecimal b = new BigDecimal("7");

//Equivalent to result = MIN(a,b) 
BigDecimal result = a.min(b);
System.out.println(result);

परिणाम: 5

9.मोव पॉइंट टू लेफ्ट

BigDecimal a = new BigDecimal("5234.49843776");

//Moves the decimal point to 2 places left of current position
BigDecimal result = a.movePointLeft(2);
System.out.println(result);

परिणाम: 52.3449843776

10.मोव पॉइंट टू राइट

BigDecimal a = new BigDecimal("5234.49843776");

//Moves the decimal point to 3 places right of current position
BigDecimal result = a.movePointRight(3);
System.out.println(result);

परिणाम: 5234498.43776

उपर्युक्त उदाहरणों के लिए मापदंडों के कई और विकल्प और संयोजन हैं (उदाहरण के लिए, विभाजन विधि के 6 रूपांतर हैं), यह सेट एक गैर-विस्तृत सूची है और कुछ बुनियादी उदाहरणों को शामिल करता है।

फ्लोट के बजाय बिगडेसिमल का उपयोग करना

जिस तरह से फ्लोट प्रकार को कंप्यूटर मेमोरी में दर्शाया गया है, इस प्रकार का उपयोग करने के संचालन के परिणाम गलत हो सकते हैं - कुछ मान सन्निकटन के रूप में संग्रहीत होते हैं। इसके अच्छे उदाहरण मौद्रिक गणना हैं। यदि उच्च परिशुद्धता आवश्यक है, तो अन्य प्रकारों का उपयोग किया जाना चाहिए। उदाहरण के लिए Java 7 BigDecimal प्रदान करता है।

import java.math.BigDecimal;

public class FloatTest {

public static void main(String[] args) {
    float accountBalance = 10000.00f;
    System.out.println("Operations using float:");
    System.out.println("1000 operations for 1.99");
    for(int i = 0; i<1000; i++){
        accountBalance -= 1.99f;
    }
    System.out.println(String.format("Account balance after float operations: %f", accountBalance));
    
    BigDecimal accountBalanceTwo = new BigDecimal("10000.00");
    System.out.println("Operations using BigDecimal:");
    System.out.println("1000 operations for 1.99");
    BigDecimal operation = new BigDecimal("1.99");
    for(int i = 0; i<1000; i++){
        accountBalanceTwo = accountBalanceTwo.subtract(operation);
    }
    System.out.println(String.format("Account balance after BigDecimal operations: %f", accountBalanceTwo));
}

इस कार्यक्रम का आउटपुट है:

Operations using float:
1000 operations for 1.99
Account balance after float operations: 8009,765625
Operations using BigDecimal:
1000 operations for 1.99
Account balance after BigDecimal operations: 8010,000000

10000 के शुरुआती बैलेंस के लिए, 1.99 के लिए 1000 ऑपरेशन के बाद, हम उम्मीद करते हैं कि शेष राशि 8010.00 होगी। फ्लोट प्रकार का उपयोग करने से हमें लगभग 8009.77 उत्तर मिलता है, जो कि मठ की गणना के मामले में अस्वीकार्य रूप से असंभव है। BigDecimal का उपयोग हमें उचित परिणाम देता है।

BigDecimal.valueOf ()

BigDecimal वर्ग में अक्सर उपयोग की जाने वाली संख्याओं का आंतरिक कैश होता है जैसे 0 से 10। BigDecimal.valueOf () विधियों को समान प्रकार के मापदंडों के साथ निर्माणकर्ताओं को वरीयता में प्रदान किया जाता है अर्थात नीचे दिए गए उदाहरण में b को प्राथमिकता दी जाती है।

BigDecimal a = BigDecimal.valueOf(10L); //Returns cached Object reference
BigDecimal b = new BigDecimal(10L); //Does not return cached Object reference

BigDecimal a = BigDecimal.valueOf(20L); //Does not return cached Object reference
BigDecimal b = new BigDecimal(20L); //Does not return cached Object reference


BigDecimal a = BigDecimal.valueOf(15.15); //Preferred way to convert a double (or float) into a BigDecimal, as the value returned is equal to that resulting from constructing a BigDecimal from the result of using Double.toString(double)
BigDecimal b = new BigDecimal(15.15); //Return unpredictable result

मूल्य शून्य, एक या दस के साथ BigDecimals का प्रारंभ

बिगडेसीमल शून्य, एक और दस की संख्या के लिए स्थिर गुण प्रदान करता है। वास्तविक संख्याओं का उपयोग करने के बजाय इनका उपयोग करना अच्छा है:

स्थैतिक गुणों का उपयोग करके, आप एक अनावश्यक तात्कालिकता से बचते हैं, साथ ही आपको एक 'मैजिक नंबर' के बजाय अपने कोड में शाब्दिक रूप से मिला है।

//Bad example:
BigDecimal bad0 = new BigDecimal(0);
BigDecimal bad1 = new BigDecimal(1);
BigDecimal bad10 = new BigDecimal(10);

//Good Example:
BigDecimal good0 = BigDecimal.ZERO;
BigDecimal good1 = BigDecimal.ONE;
BigDecimal good10 = BigDecimal.TEN;


Modified text is an extract of the original Stack Overflow Documentation
के तहत लाइसेंस प्राप्त है CC BY-SA 3.0
से संबद्ध नहीं है Stack Overflow