[Java] डबल बनाम BigDecimal?


Answers

मेरी अंग्रेजी अच्छी नहीं है इसलिए मैं यहां एक साधारण उदाहरण लिखूंगा।

    double a = 0.02;
    double b = 0.03;
    double c = b - a;
    System.out.println(c);

    BigDecimal _a = new BigDecimal("0.02");
    BigDecimal _b = new BigDecimal("0.03");
    BigDecimal _c = _b.subtract(_a);
    System.out.println(_c);

कार्यक्रम आउटपुट:

0.009999999999999998
0.01

कोई अभी भी डबल का उपयोग करना चाहता है? ;)

Question

मुझे कुछ फ़्लोटिंग पॉइंट वेरिएबल्स की गणना करनी है और मेरे सहयोगी ने मुझे double बजाय BigDecimal का उपयोग करने का सुझाव दिया है क्योंकि यह अधिक सटीक होगा। लेकिन मैं जानना चाहता हूं कि यह क्या है और BigDecimal अधिक कैसे निकालना है?




यदि आप दशमलव मान के रूप में 1/7 जैसे मान लिखना चाहते हैं तो आपको मिलता है

1/7 = 0.142857142857142857142857142857142857142857...

142857 के अनंत अनुक्रम के साथ। लेकिन चूंकि आप केवल अंकों की एक सीमित संख्या लिख ​​सकते हैं, आप अनिवार्य रूप से एक गोल (या छंटनी) त्रुटि पेश करेंगे।

दुर्भाग्यवश, 1/10 या 1/100 जैसे संख्याओं को एक आंशिक भाग के साथ द्विआधारी संख्याओं के रूप में व्यक्त किया गया है, इसमें दशमलव संख्याओं की असीमित संख्या भी होती है।

1/10 = binary 0.000110011001100110...

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

दूसरी तरफ, दशमलव संख्या (जैसे BigDecimal ), प्रत्येक दशमलव अंक को स्टोर करें। इसका मतलब यह है कि एक दशमलव प्रकार एक बाइनरी फ्लोटिंग पॉइंट या निश्चित बिंदु प्रकार से सामान्य सटीक रूप से अधिक सटीक नहीं है (उदाहरण के लिए यह परिशुद्धता के नुकसान के बिना 1/7 स्टोर नहीं कर सकता), लेकिन यह सीमित संख्या के साथ दिए गए नंबरों के लिए अधिक सटीक है दशमलव अंक, अक्सर पैसे की गणना के मामले में होता है।

जावा के BigDecimal का अतिरिक्त लाभ है कि इसमें दशमलव बिंदु के दोनों किनारों पर अंक की BigDecimal मनमानी (लेकिन सीमित) संख्या हो सकती है, केवल उपलब्ध स्मृति द्वारा ही सीमित है।




package j2ee.java.math;

/**
 *      Generated from IDL definition of "valuetype "BigDecimal""
 *      TomORB IDL compiler v1.0
 */

public abstract class BigDecimal extends j2ee.java.lang.Number implements org.omg.CORBA.portable.StreamableValue, j2ee.java.lang.Comparable

{

        private String[] _truncatable_ids = {"RMI:java.math.BigDecimal:11F6D308F5398BBD:54C71557F981284F"};



        protected int scale_;

        protected j2ee.java.math.BigInteger intVal;



        /* constants */

        int ROUND_UP = 0;

        int ROUND_DOWN = 1;

        int ROUND_CEILING = 2;

        int ROUND_FLOOR = 3;

        int ROUND_HALF_UP = 4;

        int ROUND_HALF_DOWN = 5;

        int ROUND_HALF_EVEN = 6;

        int ROUND_UNNECESSARY = 7;



        public abstract int _hashCode();



        public abstract int scale();



        public abstract int signum();



        public abstract boolean _equals(org.omg.CORBA.Any arg0);



        public abstract java.lang.String _toString();



        public abstract j2ee.java.math.BigDecimal abs();



        public abstract j2ee.java.math.BigDecimal negate();



        public abstract j2ee.java.math.BigDecimal movePointLeft(int arg0);



        public abstract j2ee.java.math.BigDecimal movePointRight(int arg0);



        public abstract j2ee.java.math.BigDecimal setScale(int arg0);



        public abstract j2ee.java.math.BigDecimal setScale(int arg0, int arg1);



        public abstract j2ee.java.math.BigDecimal valueOf(long arg0);



        public abstract j2ee.java.math.BigDecimal valueOf(long arg0, int arg1);



        public abstract int compareTo(j2ee.java.math.BigDecimal arg0);



        public abstract j2ee.java.math.BigInteger toBigInteger();



        public abstract j2ee.java.math.BigInteger unscaledValue();



        public abstract j2ee.javax.rmi.CORBA.ClassDesc classU0024(java.lang.String arg0);



        public abstract j2ee.java.math.BigDecimal add(j2ee.java.math.BigDecimal arg0);



        public abstract j2ee.java.math.BigDecimal max(j2ee.java.math.BigDecimal arg0);



        public abstract j2ee.java.math.BigDecimal min(j2ee.java.math.BigDecimal arg0);



        public abstract j2ee.java.math.BigDecimal multiply(j2ee.java.math.BigDecimal arg0);



        public abstract j2ee.java.math.BigDecimal subtract(j2ee.java.math.BigDecimal arg0);



        public abstract j2ee.java.math.BigDecimal divide(j2ee.java.math.BigDecimal arg0, int arg1);



        public abstract j2ee.java.math.BigDecimal divide(j2ee.java.math.BigDecimal arg0, int arg1, int arg2);



        public void _write (org.omg.CORBA.portable.OutputStream os)

        {

               super._write( os );

               os.write_long(scale_);

         ((org.omg.CORBA_2_3.portable.OutputStream)os).write_value( new java.lang.String("intVal") );

        }



        public void _read (final org.omg.CORBA.portable.InputStream os)
        {
               super._read( os );

               scale_=os.read_long();

         intVal=(j2ee.java.math.BigInteger)((org.omg.CORBA_2_3.portable.InputStream)os).read_value ( "RMI:java.math.BigInteger:E2F79B6E7A470003:8CFC9F1FA93BFB1D".toString() );
        }

        public String[] _truncatable_ids()
        {
               return _truncatable_ids;
        }

        public org.omg.CORBA.TypeCode _type()
        {
               return j2ee.java.math.BigDecimalHelper.type();
        }
}