कल्पना कीजिए कि आप TimeSpan
प्रकार को डिज़ाइन करने के लिए जिम्मेदार डेवलपर हैं। आपके पास जगह की सभी बुनियादी कार्यक्षमताएं हैं; यह सब महान काम कर रहा प्रतीत होता है। फिर एक दिन कुछ बीटा परीक्षक साथ आता है और आप इस कोड को दिखाता है:
double x = 100000000000000;
double y = 0.5;
TimeSpan t1 = TimeSpan.FromMilliseconds(x + y);
TimeSpan t2 = TimeSpan.FromMilliseconds(x) + TimeSpan.FromMilliseconds(y);
Console.WriteLine(t1 == t2);
क्यों कि उत्पादन False
? परीक्षक आपको पूछता है। भले ही आप समझते हैं कि ऐसा क्यों हुआ (x
और y
को जोड़ने में परिशुद्धता का नुकसान), आपको यह मानना है कि क्लाइंट परिप्रेक्ष्य से थोड़ा अजीब लगता है।
x = 10.0;
y = 0.5;
t1 = TimeSpan.FromMilliseconds(x + y);
t2 = TimeSpan.FromMilliseconds(x) + TimeSpan.FromMilliseconds(y);
Console.WriteLine(t1 == t2);
यह एक आउटपुट True
: तो फिर वह आप पर इस एक फेंकता है! परीक्षक समझदारी से संदेहजनक है।
इस बिंदु पर आपके पास निर्णय लेने का निर्णय है। या तो आप TimeSpan
मूल्यों के बीच अंकगणितीय संचालन कि double
मूल्यों से निर्माण किया गया एक परिणाम जिसका सटीक double
प्रकार ही -eg, 100,000,000,000,000.5 (16 महत्वपूर्ण आंकड़े) की सटीकता से अधिक उपज के लिए अनुमति दे सकते हैं -या आप कर सकते हैं, तो आप पता है, इसे अनुमति दें।
तो आप तय करते हैं, आप जानते हैं कि, मैं सिर्फ यह इतना है कि बनाती हूँ कोई भी तरीका एक double
का उपयोग करता है के निर्माण के लिए एक TimeSpan
निकटतम मिलीसेकंड के लिए बढ़ा दिया जाएगा। इस तरह, यह स्पष्ट रूप से दस्तावेज किया गया है जो double
से TimeSpan
में कनवर्ट करना एक हानिकारक ऑपरेशन है, जो मुझे ऐसे मामलों में पूर्ण करता है जहां ग्राहक double
से TimeSpan
में परिवर्तित होने और सटीक परिणाम की उम्मीद करने के बाद इस तरह अजीब व्यवहार देखता है।
मैं जरूरी नहीं कि यह तर्कसंगत है कि यह "सही" निर्णय है; स्पष्ट रूप से, यह दृष्टिकोण अपने आप पर कुछ भ्रम पैदा करता है। मैं बस इतना कह रहा हूं कि एक निर्णय या एक दूसरे के लिए एक निर्णय की जरूरत है, और यह स्पष्ट रूप से तय किया गया था।
स्रोत
2011-01-22 07:43:35
मुझे पुराना जवाब देखने के लिए खेद है। मुझे संदेह है कि मैं कुछ भी बेहतर तरीके से आ सकता हूं (और मैं इसे +1 करना चाहता था ...) – Peter
"[के] अब यह क्यों हो सकता है कि यह मामला बर्बाद समय के साथ आसान हो जाएगा।" इसे एक सनकी लागत पर विचार करें। – jason
उस भी काट दिया गया। मेरा सिद्धांत यह है कि यह .NET 1 में एक बग था और इसे बदला नहीं गया है क्योंकि यह मौजूदा प्रोग्राम तोड़ देगा। आईएमओ एमएस को यह इंगित करने के लिए इंटेलिजेंस विवरण को कम से कम अद्यतन करना चाहिए कि इन फ़ंक्शन में केवल मिलीसेकंड सटीक है। – CodesInChaos