तो मैं इस मुद्दे में जा रहा हूं ... मेरे पास बहुत अधिक इस्तेमाल किया जाने वाला वेब एप्लिकेशन है, जो कि 2 वर्षों में पहली बार समानता समारोह का उपयोग करते हुए दो युगल पर समानता जांच करने में असफल रहा, एक सहयोगी ने कहा वह वर्षों से भी इस्तेमाल कर रहा था।.NET में दो युगल की समानता की जांच के साथ समस्याएं - इस विधि के साथ क्या गलत है?
जिस फ़ंक्शन में मैं पेस्ट करने जा रहा हूं उसका लक्ष्य दो डबल मानों की तुलना सटीकता के 4 अंकों से करना और तुलना परिणामों को वापस करना है। उदाहरण के लिए, मेरी मान हैं:
Dim double1 As Double = 0.14625000000000002 ' The result of a calculation
Dim double2 As Double = 0.14625 ' A value that was looked up in a DB
तो मैं उन्हें इस समारोह में पारित:
Public Shared Function AreEqual(ByVal double1 As Double, ByVal double2 As Double) As Boolean
Return (CType(double1 * 10000, Long) = CType(double2 * 10000, Long))
End Function
तुलना विफल रहता है। गुणन और लांग के लिए कलाकारों के बाद, तुलना से किया जा रहा समाप्त होता है:
Return 1463 = 1462
मैं यहाँ अपने खुद के सवाल का जवाब देने की तरह हूँ, लेकिन मैं देख सकता हूँ कि double1
एक डबल (17 अंक) की शुद्धता के भीतर है और कास्ट सही ढंग से काम कर रहा है।
मेरा पहला वास्तविक सवाल यह है: यदि मैं ऊपर दी गई रेखा को निम्न में बदलता हूं, तो यह सही तरीके से क्यों काम करता है (True
देता है)?
Return (CType(CType(double1, Decimal) * 10000, Long) = _
CType(CType(double2, Decimal) * 10000, Long))
करता नहीं Decimal
है और भी अधिक सटीक है, इस प्रकार लंबी करने के लिए कलाकारों अभी भी 1463
, और तुलना लौट False
होना चाहिए? मुझे लगता है कि मुझे इस सामान पर मस्तिष्क का फट है ...
दूसरा, अगर कोई तुलना करने के लिए इस फ़ंक्शन को बदलना था तो मैं अधिक सटीक या कम त्रुटि प्रवण की तलाश में हूं, क्या आप इसे बदलने की अनुशंसा करेंगे कुछ आसान है? उदाहरण के लिए:
Return (Math.Abs(double1 - double2) < 0.0001)
मैं की तरह कुछ कोशिश करने के लिए पागल हो:
Return (double1.ToString("N5").Equals(double2.ToString("N5")))
(मैं ऊपर ऐसा कभी नहीं होगा, मैं आपकी प्रतिक्रियाओं के बारे में बस उत्सुक हूँ यह में बुरी तरह अक्षम होगा मेरी। आवेदन।)
वैसे भी, अगर कोई अंतर पर कुछ प्रकाश डाल सकता है तो मैं Double
एस और Decimal
से Long
कास्टिंग के बीच देख रहा हूं, यह बहुत अच्छा होगा।
धन्यवाद!
"... डबल से दशमलव तक कास्ट सटीक खो रहा है ..." इससे मेरा दिमाग दुख पहुंचाता है। परिशुद्धता क्यों गुम हो जाती है? ऐसा इसलिए है क्योंकि एक दशमलव एक डबल से अलग आधार है; यानी यह इसलिए है क्योंकि संख्याएं अलग-अलग संग्रहित होती हैं? –
कोई बात नहीं। मैं बिना सोच के टाइप कर रहा हूँ। मेरा मतलब था कि कास्ट संकुचित हो रहा था (यानी जानकारी खोना), जो यह है, लेकिन मुझे नुकसान क्यों हुआ है। दशमलव दस्तावेज के अनुसार, डबल से दशमलव तक कास्टिंग कुछ भी नहीं खोता है, लेकिन डीबगर छोटे हिस्से को गायब कर रहा है: यानी डिम टेस्ट के रूप में नया दशमलव (0.14625000000000002) परिणामस्वरूप 0.14625 युक्त परीक्षण होता है। हालांकि, डिम टेस्ट के रूप में दशमलव = 0.14625000000000002D काम करता है। मैं फ़्लोटिंग पॉइंट अंकगणितीय के बारे में लिंक्ड आलेख पढ़ूंगा और इस बिंदु पर जवाब देना बंद कर दूंगा ... –
और कुछ और दस्तावेज के माध्यम से खोज से पता चलता है: "यह कन्स्ट्रक्टर राउंड निकटतम के लिए गोल करके 15 महत्वपूर्ण अंकों के लिए मूल्यवान है। यह तब भी किया जाता है जब यह किया जाता है संख्या में 15 से अधिक अंक हैं और कम महत्वपूर्ण अंक शून्य हैं।" –