आप फ़्लोटिंग पॉइंट प्रकार का उपयोग करने के लाभों के साथ हाजिर हैं। मैं सभी मामलों में दशमलव के लिए डिजाइन करता हूं, और मुझे यह बताने के लिए एक प्रोफाइलर पर निर्भर करता है कि क्या दशमलव पर संचालन में अड़चनें या धीमी गति से गिरावट हो रही है। उन मामलों में, मैं डबल या फ्लोट करने के लिए "डाउन कास्ट" करूंगा, लेकिन केवल इसे आंतरिक रूप से करते हैं, और ध्यान से गणितीय संचालन में महत्वपूर्ण अंकों की संख्या को सीमित करके सटीक नुकसान का प्रबंधन करने का प्रयास करते हैं।
सामान्य तौर पर, यदि आपका मूल्य क्षणिक है (पुन: उपयोग नहीं किया गया है), तो आप एक फ्लोटिंग पॉइंट प्रकार का उपयोग करने के लिए सुरक्षित हैं। फ़्लोटिंग पॉइंट प्रकारों के साथ वास्तविक समस्या निम्नलिखित तीन परिदृश्य हैं।
- आप फ़्लोटिंग पॉइंट मानों को एकत्र कर रहे हैं (जिस स्थिति में सटीक त्रुटियाँ कंपाउंड हैं)
- आप फ़्लोटिंग पॉइंट मान के आधार पर मान बनाते हैं (उदाहरण के लिए पुनरावर्ती एल्गोरिथ्म में)
- आप बहुत महत्वपूर्ण अंकों के साथ गणित कर रहे हैं (उदाहरण के लिए,
123456789.1 * .000000000000000987654321
)
संपादित करें
C # दशमलव पर संदर्भ दस्तावेज के अनुसार :
दशमलव कीवर्ड एक 128-बिट डेटा प्रकार को दर्शाता है। फ्लोटिंग-पॉइंट प्रकारों की तुलना में, दशमलव प्रकार में अधिक सटीक और एक छोटी रेंज होती है, जो इसे वित्तीय और मौद्रिक गणनाओं के लिए उपयुक्त बनाती है।
तो मेरे उपरोक्त कथन को स्पष्ट करने के लिए:
मैं सभी मामलों में दशमलव के लिए डिजाइन करता हूं, और मुझे यह बताने के लिए एक प्रोफाइलर पर निर्भर करता है कि क्या दशमलव पर संचालन में अड़चनें या धीमी गति से गिरावट हो रही है।
मैंने केवल उन उद्योगों में काम किया है जहां दशमलव अनुकूल हैं। यदि आप फ़ेसिक्स या ग्राफ़िक्स इंजन पर काम कर रहे हैं, तो फ़्लोटिंग पॉइंट प्रकार (फ्लोट या डबल) के लिए डिज़ाइन करना शायद अधिक फायदेमंद है।
दशमलव असीम रूप से सटीक नहीं है (एक आदिम डेटा प्रकार में गैर-अभिन्न के लिए अनंत सटीकता का प्रतिनिधित्व करना असंभव है), लेकिन यह दोहरे से कहीं अधिक सटीक है:
- दशमलव = 28-29 महत्वपूर्ण अंक
- डबल = 15-16 महत्वपूर्ण अंक
- फ्लोट = 7 महत्वपूर्ण अंक
EDIT 2
के जवाब में कोनराड रूडोल्फ की टिप्पणी, आइटम # 1 (ऊपर) निश्चित रूप से सही है। अभेद्यता का एकत्रीकरण वास्तव में यौगिक है। एक उदाहरण के लिए नीचे दिया गया कोड देखें:
private const float THREE_FIFTHS = 3f / 5f;
private const int ONE_MILLION = 1000000;
public static void Main(string[] args)
{
Console.WriteLine("Three Fifths: {0}", THREE_FIFTHS.ToString("F10"));
float asSingle = 0f;
double asDouble = 0d;
decimal asDecimal = 0M;
for (int i = 0; i < ONE_MILLION; i++)
{
asSingle += THREE_FIFTHS;
asDouble += THREE_FIFTHS;
asDecimal += (decimal) THREE_FIFTHS;
}
Console.WriteLine("Six Hundred Thousand: {0:F10}", THREE_FIFTHS * ONE_MILLION);
Console.WriteLine("Single: {0}", asSingle.ToString("F10"));
Console.WriteLine("Double: {0}", asDouble.ToString("F10"));
Console.WriteLine("Decimal: {0}", asDecimal.ToString("F10"));
Console.ReadLine();
}
यह निम्न आउटपुट देता है:
Three Fifths: 0.6000000000
Six Hundred Thousand: 600000.0000000000
Single: 599093.4000000000
Double: 599999.9999886850
Decimal: 600000.0000000000
जैसा कि आप देख सकते हैं, भले ही हम एक ही स्रोत स्थिरांक से जोड़ रहे हैं, फिर भी दोहरे के परिणाम कम सटीक हैं (हालांकि संभवतः सही ढंग से गोल होंगे), और फ्लोट उस बिंदु तक कम सटीक है, जहां यह केवल घटाया गया है दो महत्वपूर्ण अंक।