2012-05-24 14 views
25

के साथ आवश्यक राउंडिंग मैं दो बिगडिसीमल संख्या a और b के पैमाने को सेट करना चाहता हूं। के रूप में इस उदाहरण में:BigDecimal संख्या

BigDecimal a = new BigDecimal("2.6E-1095"); 
     BigDecimal b = new BigDecimal("2.7E-1105"); 
     int i = 112, j=1; 

     BigDecimal aa = a.setScale(i+j); 
     BigDecimal bb = b.setScale(i+j); 

और जब मैं चलाने मैं इस अपवाद है:

java.lang.ArithmeticException: Rounding necessary 
    at java.math.BigDecimal.divideAndRound(BigDecimal.java:1439) 
    at java.math.BigDecimal.setScale(BigDecimal.java:2394) 
    at java.math.BigDecimal.setScale(BigDecimal.java:2437) 

क्यों राउंडिंग के लिए आवश्यक है? अगर मैं चारों ओर नहीं बनाना चाहता, तो कृपया समाधान क्या है?

धन्यवाद

+0

वास्तव में यह एक आश्चर्य है। दस्तावेज़ों को देखे बिना मुझे स्केल को स्केल पर स्कैन करने की उम्मीद थी ... –

उत्तर

26

आप दो BigDecimal संख्या जो दोनों के 1000 से अधिक दशमलव स्थानों की आवश्यकता है। स्केल को केवल 113 दशमलव स्थानों पर सेट करने का प्रयास करने का अर्थ है कि आप सटीकता खो देंगे और इसलिए आपको गोल करने की आवश्यकता है।

आप सेटस्केल विधियों का उपयोग कर सकते हैं जो अपवाद को रोकने के लिए राउंडिंगमोड लेते हैं लेकिन गोल नहीं करते हैं।

4

राउंडिंग आवश्यक है।

javadoc for BigDecimal में, यह जहां unscaledValue एक arbitatrily लंबे पूर्णांक है और पैमाने एक 32-बिट पूर्णांक के रूप में (unscaledValue 10 -scale ×) BigDecimal प्रतिनिधित्व किया है, कहते हैं।

2.6 * 10 -1095 को सटीक रूप से प्रतिनिधित्व करने के लिए कम से कम 1096 के पैमाने की आवश्यकता होती है। इसे (किसी भी पूर्णांक) के साथ सटीक रूप से प्रदर्शित नहीं किया जा सकता है * 10 -113। इसलिए, आपको roundingMode प्रदान करने की आवश्यकता है।

5

सेटस्केल विधि के roudingMode का उपयोग करने का प्रयास करें।

कुछ बात की तरह:

BigDecimal aa = a.setScale(i+j, BigDecimal.ROUND_HALF_DOWN); 
संबंधित मुद्दे