2013-04-25 9 views
44

मैं संख्या को बिगडिसीमल में कनवर्ट करने का सबसे अच्छा तरीका ढूंढ रहा हूं।जावा नंबर को BigDecimal में कनवर्ट करें: सबसे अच्छा तरीका

क्या यह पर्याप्त है?

Number number; 
BigDecimal big = new BigDecimal(number.toString()); 

क्या हम toString() विधि के साथ सटीकता खो सकते हैं?

+2

आपका कोड 'NumberFormatException' फेंक सकता है - यदि' संख्या' एक 'डबल' है जो अनंत या NaN है http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/Double .html # toString (डबल) –

+0

टिप के लिए धन्यवाद! मैं यह –

उत्तर

32

यह ठीक है, याद रखें कि एक मूल्य घोषित करने के लिए बिगडेसिमल के निर्माता का उपयोग खतरनाक हो सकता है जब यह स्ट्रिंग प्रकार नहीं है। नीचे पर विचार करें ...

BigDecimal valDouble = new BigDecimal(0.35); 
System.out.println(valDouble); 

यह 0.35 मुद्रित नहीं, यह वास्तव में होगा ...

0.34999999999999997779553950749686919152736663818359375 

मैं कहता हूँ कि आपके द्वारा समाधान शायद उसकी वजह से सबसे सुरक्षित है।

+0

हाँ जांचना भूल गया, मैंने देखा है। मेरी चिंता 'डबल' के लिए 'toString()' विधि के बारे में है, मैं सोच रहा था कि क्या हम इस विधि के साथ सटीकता को खो सकते हैं। –

+0

नहीं, यद्यपि यह पहले से ही बिगडिसीमल था, लेकिन स्वाभाविक रूप से अधिक सटीकता होगी। यदि यह मुद्रा से निपट रहा है, तो आपको हमेशा सबकुछ बिगडिसीमल बनाना चाहिए। यदि इसे डबल से डालने से पहले बिगडेसिमल घोषित किया गया था, तो यह मेरी राय में सबसे अच्छा समाधान होगा और समीकरण को पूरी तरह से बाहर ले जाएगा। – david99world

16

क्या हम toString() विधि के साथ सटीकता खो सकते हैं?

की तरह ... Float.toString() और Double.toString() केवल दशमलव विभाजक के बाद अंकों की संख्या आउटपुट करता है, जो आउटपुट के लिए एक फ्लोट या डबल मान के अनुरूप विशिष्ट रूप से आवश्यक है।

david99world के जवाब में 0.35 उदाहरण का उपयोग करने के लिए, पर विचार के लिए निम्न कोड:

BigDecimal bd1 = new BigDecimal(0.35); 

Number n = 0.35; 
BigDecimal bd2 = new BigDecimal(n.toString()); 

System.out.println(bd1); 
System.out.println(bd2); 

एक सहज उम्मीद हो सकता है कि दो BigDecimal उदाहरणों समान हैं, लेकिन उत्पादन से पता चलता है कि वे नहीं कर रहे हैं:

0.34999999999999997779553950749686919152736663818359375 
0.35 

पहली पंक्ति डबल का सटीक मान है, क्योंकि 0.35 बिल्कुल प्रदर्शित नहीं किया जा सकता है। दूसरी पंक्ति 0.35 है, क्योंकि अलग-अलग मान का प्रतिनिधित्व करने के लिए और अधिक fractional अंकों की आवश्यकता नहीं है। जैसे बयान 0.34999999999999997779553950749686919152736663818359375 == 0.35true का मूल्यांकन करेगा।

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

संबंधित मुद्दे