java - अंकगणित अपवाद: "गैर-समाप्ति दशमलव विस्तार; कोई सटीक प्रतिनिधित्व करने योग्य दशमलव परिणाम "




bigdecimal arithmeticexception (5)

निम्नलिखित कोड नीचे दिखाए गए अपवाद को क्यों बढ़ाता है?

BigDecimal a = new BigDecimal("1.6");
BigDecimal b = new BigDecimal("9.2");
a.divide(b) // results in the following exception.

-

java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result.

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

a.divide(b, 2, RoundingMode.HALF_EVEN)

2 सटीक है। अब समस्या हल हो गई थी।


ऐसा इसलिए है क्योंकि बिगडेसिमल खो गया नहीं है, और यदि आप उदाहरण के लिए 1/3 विभाजित करते हैं, तो इसके परिणामस्वरूप अनंतता को दोहराया जाएगा। 0.33333333 ... सैद्धांतिक रूप से यदि आप वापस गुणा करते हैं, तो आपको सटीक परिणाम प्राप्त होता है। लेकिन, एक अनंत संख्या प्रवाह पर ढेर उत्पन्न करेगी और इस मामले में अपवाद लॉन्च किया जाएगा।

मेरा समाधान:

 try {
     result = n1.divide(n2);
 } catch (ArithmeticException e){
     Log.d("Error bigdecimal", e.toString());
     result = (n1.doubleValue() / n2.doubleValue());
 };

इस मामले में आपका परिणाम गोल करके कट नहीं किया जाएगा



मुझे यह वही समस्या थी, क्योंकि कोड की मेरी लाइन थी:

txtTotalInvoice.setText(var1.divide(var2).doubleValue() + "");

मैं इसे बदलता हूं, पिछले उत्तर पढ़ रहा हूं, क्योंकि मैं दशमलव परिशुद्धता नहीं लिख रहा था:

txtTotalInvoice.setText(var1.divide(var2,4, RoundingMode.HALF_UP).doubleValue() + "");

4 दशमलव प्रीसीन है

और RoundingMode Enum स्थिरांक हैं, आप UP, DOWN, CEILING, FLOOR, HALF_DOWN, HALF_EVEN, HALF_UP कोई भी UP, DOWN, CEILING, FLOOR, HALF_DOWN, HALF_EVEN, HALF_UP

इस मामले में HALF_UP, इसका परिणाम होगा:

2.4 = 2   
2.5 = 3   
2.7 = 3

आप यहां RoundingMode जानकारी देख सकते हैं: http://www.javabeat.net/precise-rounding-of-decimals-using-rounding-mode-enumeration/


जावा 5 डॉक्स से (जावा 8 दस्तावेज़ here ):

जब एक MathContext ऑब्जेक्ट को 0 की सटीक सेटिंग (उदाहरण के लिए, MathContext.UNLIMITED) के साथ आपूर्ति की जाती है, अंकगणितीय परिचालन सटीक होते हैं, जैसे अंकगणितीय विधियां जो कोई MathContext ऑब्जेक्ट नहीं लेती हैं। (यह एकमात्र व्यवहार है जिसे 5 से पहले रिलीज़ में समर्थित किया गया था)

सटीक परिणाम की गणना करने के एक सिद्धांत के रूप में, 0 की सटीक सेटिंग के साथ MathContext ऑब्जेक्ट की गोलाकार मोड सेटिंग का उपयोग नहीं किया जाता है और इस प्रकार अप्रासंगिक है। विभाजन के मामले में, सटीक मात्रा में असीमित लंबे दशमलव विस्तार हो सकता है; उदाहरण के लिए, 1 से 3 विभाजित।

यदि मात्रा में एक गैर-दशमलव दशमलव विस्तार होता है और ऑपरेशन को सटीक परिणाम लौटने के लिए निर्दिष्ट किया जाता है, तो एक अंकगणितीय अपवाद फेंक दिया जाता है। अन्यथा, विभाजन के सटीक परिणाम को वापस किया जाता है, जैसा कि अन्य परिचालनों के लिए किया जाता है।

ठीक करने के लिए, आपको ऐसा कुछ करने की ज़रूरत है :

a.divide(b, 2, RoundingMode.HALF_UP)

where 2 is precision and RoundingMode.HALF_UP is rounding mode

अधिक जानकारी: http://jaydeepm.wordpress.com/2009/06/04/bigdecimal-and-non-terminating-decimal-expansion-error/