2009-06-29 15 views
13

मैंने इस कन्स्ट्रक्टर (यहां तक ​​कि स्टैक ओवरफ़्लो पर भी) पर काफी दर्द देखा है। लोग इसका इस्तेमाल करते हैं, भले ही प्रलेखन स्पष्ट रूप से कहा गया है:बिगडेसिमल (डबल डी) निर्माण अभी भी क्यों है?

इस निर्माता के परिणाम कुछ हद तक अप्रत्याशित हो सकते हैं http://java.sun.com/javase/6/docs/api/java/math/BigDecimal.html#BigDecimal(double)

मैं भी एक JSR-13 जा रहा है एक सिफारिश करते हुए कहा साथ APPROVED देखा है:

मौजूदा विनिर्देश जिन्हें बहिष्कृत किया जा सकता है: हम BigDec को बहिष्कृत करने का प्रस्ताव देते हैं इमाल (डबल) कन्स्ट्रक्टर, जो वर्तमान में परिणाम देता है जो Double.toString() विधि से अलग होते हैं।

इन सबके बावजूद, निर्माता को अभी तक बहिष्कृत नहीं किया गया है।

मुझे इस पर कोई विचार सुनना अच्छा लगेगा।

उत्तर

2

बहिष्करण बहिष्कृत किया गया है। एपीआई के हिस्सों को असाधारण मामलों में केवल बहिष्कृत किया गया है।

तो, अपनी बिल्ड प्रक्रिया के हिस्से के रूप में FindBugs चलाएं। FindBugs में डिटेक्टर प्लगइन एपीआई है और यह ओपन सोर्स (एलजीपीएल, आईआईआरसी) भी है।

+1

मैं सराहना करता हूं बहिष्कार पर टिप्पणी। धन्यवाद। –

+0

.. और लंबे विचार के बाद मुझे लगता है कि यह एकमात्र संभावित उत्तर है - एपीआई के रखवालों से एक नीति। कुछ भी पूरी तरह से यह समझा नहीं सकता है। –

+3

बहिष्करण क्यों बहिष्कृत किया गया है? मैंने अभी http://docs.oracle.com/javase/7/docs/technotes/guides/javadoc/deprecation/deprecation.html पाया है और यह इसके बारे में कुछ भी नहीं कहता है। – siledh

1

उस विशेष निर्माता, सभी फ़्लोटिंग पॉइंट ऑपरेशंस की तरह, एक अनुमान है। यह वास्तव में टूटा नहीं है, इसमें सिर्फ कमियां हैं।
बस अपना शोध करें, देखभाल के साथ संपर्क करें, और आपको कोई आश्चर्य नहीं मिलेगा। दशमलव अक्षर को युगल/फ्लोट्स को असाइन करते समय आप वही चीज़ चलाते हैं।

+2

अच्छा बिंदु, यह असुरक्षित डेवलपर्स के लिए एक लैंडमाइन की तरह है। लैंडमाइन्स ने लंबे समय तक किसी को भी सेवा नहीं दी .. यही कारण है कि जेएसआर मुझे लगता है ... –

18

BigDecimal(double) के व्यवहार को ध्यान में रखते हुए, मेरी राय में, मुझे यकीन नहीं है कि यह वास्तव में ऐसी समस्या होगी।

मैं बिल्कुल BigDecimal(double) निर्माता में दस्तावेज के शब्दों के साथ सहमत नहीं होगा:

इस निर्माता के परिणामों कुछ हद तक अप्रत्याशित हो सकता है। एक मान सकता है लेखन जावा में new BigDecimal(0.1) बनाता है कि एक BigDecimal जो वास्तव में 0.1 के बराबर है (1 की एक बगैर माप का मूल्य, 1 के पैमाने के साथ), लेकिन यह वास्तव में बराबर 0.1000000000000000055511151231257827021181583404541015625 है।

बल्कि अप्रत्याशित कह से (जोर जोड़ा।)

, मुझे लगता है कि शब्दों अप्रत्याशित, और फिर भी, यह जो लोग सीमाओं की जानकारी नहीं है के लिए अप्रत्याशित व्यवहार होगा होना चाहिए floating point values के साथ दशमलव संख्याओं का प्रतिनिधित्व।

जब तक कोई यह ध्यान में रखता है कि फ़्लोटिंग पॉइंट मान सटीक के साथ सभी दशमलव मानों का प्रतिनिधित्व नहीं कर सकते हैं, BigDecimal(0.1)0.1000000000000000055511151231257827021181583404541015625 का उपयोग करके लौटाया गया मूल्य वास्तव में समझ में आता है।

BigDecimalBigDecimal(double) कन्स्ट्रक्टर द्वारा तुरंत ऑब्जेक्ट किया गया ऑब्जेक्ट लगातार है, तो मैं तर्क दूंगा कि परिणाम अनुमानित है।

मेरा अनुमान है कि क्यों BigDecimal(double) कन्स्ट्रक्टर को बहिष्कृत नहीं किया जा रहा है क्योंकि व्यवहार को सही माना जा सकता है, और जब तक कोई जानता है कि फ़्लोटिंग पॉइंट प्रस्तुतियां कैसे काम करती हैं, तो कन्स्ट्रक्टर का व्यवहार बहुत आश्चर्यजनक नहीं है।

+1

महान तर्क! "> जब तक कोई जानता है कि फ़्लोटिंग पॉइंट प्रस्तुतियां कैसे काम करती हैं" ... अनुमान लगाएं कि यह वाक्य प्रोग्रामिंग दुनिया का ~ 95% समाप्त हो सकता है (शायद अधिक)। लेखांकन त्रुटियों में लाखों (?) डॉलर के कारण होने वाले 9 5% प्रोग्रामर को रोकने से शायद जेएसआर -13 में सिफारिश की जा सकती है :) –

+2

उस तर्क के बाद (न केवल) डबल और फ्लोट को हटाया जाना चाहिए ASAP –

+0

कंप्यूटर वैज्ञानिकों के लिए यह महत्वपूर्ण है याद रखने के लिए कि सभी फ़्लोटिंग पॉइंट मानों का प्रतिनिधित्व नहीं किया जा सकता है, लेकिन मुझे नहीं लगता कि इसका मतलब यह है कि यह कन्स्ट्रक्टर अच्छा है। जबकि कुछ फ्लोटिंग पॉइंट मानों को डबल, आईएमओ द्वारा प्रदर्शित नहीं किया जा सकता है, वहां कोई कारण नहीं होना चाहिए कि डबल कन्स्ट्रक्टर का उपयोग करते समय गलत तरीके से प्रस्तुत किया जा सके। वास्तव में, यह भी बदतर है कि इस वर्ग के भीतर अन्य दस्तावेज कन्स्ट्रक्टर की कमजोरी पर संकेत देते हैं http://docs.oracle.com/javase/7/docs/api/java/math/BigDecimal.html#valueOf(double) – butallmj

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