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




bigdecimal arithmeticexception (6)

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

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

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

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

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.

क्योंकि आप एक परिशुद्धता और एक गोल-मोड निर्दिष्ट नहीं कर रहे हैं। BigDecimal शिकायत कर रहा है कि यह 10, 20, 5000, या अनंतता दशमलव स्थानों का उपयोग कर सकता है, और यह अभी भी आपको संख्या का सटीक प्रतिनिधित्व करने में सक्षम नहीं होगा। तो आपको एक गलत BigDecimal देने की बजाय, यह सिर्फ आप पर whinges।

हालांकि, यदि आप एक RoundingMode और एक परिशुद्धता की आपूर्ति करते हैं, तो यह 1.3333 जैसे कुछ के लिए 1.333333333-टू-अनंतता को परिवर्तित करने में सक्षम हो जाएगा ... लेकिन जैसा कि प्रोग्रामर को यह बताना होगा कि आप किस परिशुद्धता से खुश हैं '।


BigDecimal के लिए उत्तर अंकगणित अपवाद फेंकता है

public static void main(String[] args) {
        int age = 30;
        BigDecimal retireMentFund = new BigDecimal("10000.00");
        retireMentFund.setScale(2,BigDecimal.ROUND_HALF_UP);
        BigDecimal yearsInRetirement = new BigDecimal("20.00");
        String name = " Dennis";
        for ( int i = age; i <=65; i++){
            recalculate(retireMentFund,new BigDecimal("0.10"));
        }
        BigDecimal monthlyPension =   retireMentFund.divide(
                yearsInRetirement.divide(new BigDecimal("12"), new MathContext(2, RoundingMode.CEILING)), new MathContext(2, RoundingMode.CEILING));      
        System.out.println(name+ " will have £" + monthlyPension +" per month for retirement");
    }
public static void recalculate (BigDecimal fundAmount, BigDecimal rate){
        fundAmount.multiply(rate.add(new BigDecimal("1.00")));
    }

अपने विभाजित विधि कॉल में MathContext ऑब्जेक्ट जोड़ें और परिशुद्धता और गोल मोड समायोजित करें। यह आपकी समस्या को ठीक करना चाहिए


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

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/