क्या हम 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.35
true
का मूल्यांकन करेगा।
बिगडिसीमल बनाते समय यह वास्तव में परिशुद्धता का नुकसान नहीं है, अनिश्चितता आपके "स्रोत" मान में पहले से मौजूद है। समस्या यह है कि अलग-अलग मूल्यों का उपयोग कर संभव मूल्य स्रोत के रूप में एक फ्लोट या डबल वैल्यू को बिगडिमेमल इंस्टेंस में सटीक समतुल्य रूप से प्रदर्शित नहीं किया जाएगा।
आपका कोड 'NumberFormatException' फेंक सकता है - यदि' संख्या' एक 'डबल' है जो अनंत या NaN है http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/Double .html # toString (डबल) –
टिप के लिए धन्यवाद! मैं यह –