2014-12-30 6 views
6

प्रश्न बहुत सरल है, क्या कोई लाभ या अंतर है? मैंने देखा है कि सी # में फ़ंक्शन किसी भी दशमलव स्थान के बिना दोहरा देता है, जबकि जावा में यह दशमलव स्थान रखता है, लेकिन इसके अलावा परिणाम समान होता है।क्या स्पष्ट पूर्णांक कास्टिंग पर Math.Floor का उपयोग करने का कोई लाभ है?

यहाँ कोड मैं में जावा और सी # में प्रयोग किया जाता है, और उत्पादन:

//Java          //C# 

double a = 5.5;        double a = 5.5; 
System.out.println(Math.floor(a));   Console.WriteLine(Math.Floor(a)); 
System.out.println((int)a);     Console.WriteLine((int)a); 

//Output          //Output 

5.0           5 
5            5 
+2

जावा सभी अनुमानों के लिए '0' प्रिंट करता है। –

+0

क्या आप system.out के आउटपुट के आधार पर 'जावा यह रखता है' धारणा बना रहे हैं? यह गलत धारणा –

+2

'Math.Floor' दशमलव भाग के बिना एक डबल लौटाती है। यह –

उत्तर

14

हाँ, नकारात्मक संख्या के लिए, यह विपरीत तरह से काम करता है।

उदाहरण (मोनो के सी # इंटरैक्टिव खोल csharp उपयोग करते हुए):

csharp> Math.Floor(-12.0d) 
-12 
csharp> Math.Floor(-12.5d) 
-13 
csharp> (int) -12.5 
-12 

(के लिए दोनों जावा/सी # एक ही) और मैं सबसे अधिक भाषाओं वैसे भी लगता है।

एक पूर्णांक के लिए एक फ़्लोटिंग-पॉइंट नंबर कास्टिंग, पूर्णांक को बनाए रखने वाले दशमलव भाग को फेंककर किया जाता है। -12.5 का पूर्णांक भाग 12 है। इस प्रकार नकारात्मक संख्या Math.Ceil होती है यदि int में परिवर्तित हो जाती है।

@Matthew का तर्क है इसके अलावा के रूप में, एक float या double तरह 1.023e23 (एवोगेड्रो के निरंतर) संख्या तक पहुँच सकते हैं। बस क्योंकि mantisse अब अल्पविराम के बाद अंकों का प्रतिनिधित्व नहीं कर सकता है। संख्या वैसे भी एक पूर्णांक माना जाता है, लेकिन int द्वारा इसका प्रतिनिधित्व नहीं किया जा सकता है। Math.floor ऑपरेशन करके, कुछ भी नहीं होता है, लेकिन मान अभी भी बनाए रखा जाता है।

उदाहरण:

csharp> double ac = 1.023e23; 
csharp> Math.Floor(ac); 
1.023E+23 
csharp> (int) ac; 
0 

नोट: एक int करने के लिए रूपांतरण अतिप्रवाह में परिणाम सकता है हालांकि यह अब तक प्राप्त किए गए लग सकता है, लेकिन फिर भी अर्थ विज्ञान में एक स्पष्ट अंतर इस प्रकार है। एक अंतर जो वैसे भी त्रुटियों का कारण बनता है।

इसके अलावा, यह works differentlyके लिए अनंत संख्या और NaN:

System.out.println(Math.floor(Double.POSITIVE_INFINITY)); // Prints Infinity 
System.out.println((int)Double.POSITIVE_INFINITY);  // Prints 2147483647 
System.out.println(Math.floor(Double.NaN));    // Prints NaN 
System.out.println((int)Double.NaN);      // Prints 0 

लेकिन मैं हमेशा उन्हें फिर भी प्रयोग करेंगे। कास्टिंग चीजों को और अधिक पढ़ने योग्य बनाता है। राउंड अप अप/डाउन/ऑफ कास्ट का कुछ प्रकार (दुष्प्रभाव) है। Math.Ceil/Floor/Round का उपयोग करके यह स्पष्ट है कि आपका क्या मतलब है।

कभी-कभी एक पूर्णांक में एक कास्ट वास्तव में एक मंजिल/छत ऑपरेशन करने से थोड़ा अधिक कुशल होता है। लेकिन एक स्मार्ट कंपाइलर कभी-कभी प्राप्त कर सकता है कि एक चर हमेशा एक सकारात्मक संख्या संग्रहीत करेगा और इस प्रकार इसे स्वयं अनुकूलित करेगा। और इसके अलावा अधिकांश अनुप्रयोगों के लिए इसका परिणाम एक महत्वपूर्ण प्रदर्शन दंड होगा।

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