Math.Floor (Double) टाइप डबल का मान क्यों लौटाता है?


103

मुझे दशमलव या दोहरे से बाएं हाथ के पूर्णांक मान को प्राप्त करने की आवश्यकता है। Ex के लिए: मुझे 4.6 से 4 मान प्राप्त करने की आवश्यकता है। मैंने Math.Floor फ़ंक्शन का उपयोग करने की कोशिश की, लेकिन यह पूर्व के लिए एक डबल मान लौटा रहा है: यह 4.6 से 4.0 लौट रहा है। MSDN दस्तावेज़ीकरण कहता है कि यह पूर्णांक मान लौटाता है। क्या मुझसे कोई चूक हो रही है? या क्या मुझे प्राप्त करने का एक अलग तरीका है?


2
MSDN दस्तावेज़ीकरण कहता है कि यह पूर्णांक मान लौटाता हैMSDN प्रलेखन बताता है कि Math.Floor System.Double, पूर्णांक नहीं लौटाता है।
ब्रॉडबैंड

एक पूर्णांक मूल्य की प्रभावी रूप से आवश्यकता होती है, लेकिन इसका मतलब यह नहीं है कि इसे "इंट" या "लॉन्ग" में संग्रहीत किया जा सकता है। "डबल" सफलतापूर्वक केवल "int" की तुलना में सभी पूर्णांक मानों को बहुत व्यापक श्रेणी में संग्रहीत करता है ध्यान दें कि कुछ पूर्णांक मान तब गोल किए जा सकते हैं जब मंटिसा भाग में पूर्णांक मान के सभी अंकों को संग्रहीत करने के लिए पर्याप्त बिट्स न हों, जब इसका आधार -2 घटक 52 से ऊपर जाता है: पूर्णांक मानों का यह दोहराव पूर्णांक 2 ^ 52 या उससे नीचे -2 ^ 52 से ऊपर के पूर्णांक के लिए हो सकता है, लेकिन परिणाम अभी भी निकटतम पूर्णांक का प्रतिनिधित्व करने वाला होगा; यदि आप "(लंबा) तल (x)" का उपयोग करते हैं, तो रूपांतरण काफी हद तक गलत हो सकता है।
verdy_p

हालांकि ध्यान दें कि पूर्णांक वैल्यूज़ की एक मान्य श्रेणी जिसे "डबल" में दर्शाया जा सकता है, बहुत बड़ा है: (1 + (1 - 2 ^ )52)) × 2 ^ 1023 79 1.7976931386231515E308; यह "लंबे" के साथ 2 ^ 63-1 से बहुत अधिक है। हालाँकि पूर्णांकों की श्रेणी जो सभी को अलग-अलग संग्रहीत किया जा सकता है, अधिक प्रतिबंधित है, क्योंकि "डबल" में केवल मंटिसा के लिए 52 बिट्स हैं (प्लस 1 बिट सबसे महत्वपूर्ण बिट के लिए निहित है, संग्रहीत नहीं है), जिसका अर्थ है कि "डबल" केवल स्टोर कर सकता है पूर्णांक के पूर्णांक 2 ^ 53 से नीचे होने पर पूर्णांक।
ver__p

दुर्भाग्य से, Math.Floor () यदि संभव हो तो "लॉन्ग" का उपयोग करके एक वेरिएबल "नंबर" टाइप आंतरिक रूप से वापस नहीं करता है, या "डबल" अन्यथा केवल बड़े गोल पूर्णांक के लिए। और मानक गणित पुस्तकालय इस तरह के एकीकृत चर संख्या प्रकार को संभालता नहीं है। एक एकीकृत संख्या प्रकार को लागू करने के लिए अन्य गणित पुस्तकालय मौजूद हैं, जिनमें समर्थित रेंज या परिशुद्धता के नुकसान के बिना पैक दशमलव या बाइनरी में एन्कोड किए गए लॉन्ग, डबल, या बड़े पूर्णांक शामिल हैं।
ver__p

जवाबों:


146

की सीमा या doubleकी सीमा से अधिक व्यापक है । इस कोड पर विचार करें:intlong

double d = 100000000000000000000d;
long x = Math.Floor(d); // Invalid in reality

पूर्णांक की सीमा के बाहर है long- तो आप क्या होने की उम्मीद करेंगे?

आमतौर पर आप जानते हैं कि मूल्य वास्तव में intया के दायरे में होगा long, इसलिए आपने इसे डाला:

double d = 1000.1234d;
int x = (int) Math.Floor(d);

लेकिन उस कास्ट के लिए डेवलपर Math.Floorखुद पर नहीं, डेवलपर पर है। यह अनावश्यक रूप से प्रतिबंधात्मक होता है कि इसे केवल सीमा के बाहर सभी मूल्यों के अपवाद के साथ विफल कर दें long


2
फ़्लोर रिटर्न डबल का पूर्णांक प्रतिनिधित्व करता है, और यह वैज्ञानिक गणनाओं के लिए डबल रिटर्न करता है, यह उत्तर सही नहीं है क्योंकि डबल में 64 बिट्स हैं और लंबे समय तक 64 बिट्स भी हैं, लेकिन डबल कम महत्वपूर्ण बिट्स के सटीक अंकों को स्टोर नहीं कर सकता है, भले ही इसे सही तरीके से संग्रहीत किया जा सके लंबे समय में।
आकाश काव

1
@ जोंन: आप कैसे आए हैं, इस बात पर बहस नहीं हुई है कि सी में पॉजिटिव नंबर को नकारात्मक कैसे बनाया जाए ?
::

3
@ जॉन: अपना समय ले लो। यह पता चला है कि समुदाय -1 से सकारात्मक संख्या को गुणा करना नकारात्मक बना देगा। StackOverflow पर सब ठीक है।
मुशीनेसिस

1
@javapowered: नहीं, (int) 15.0 नहीं है । 0. कुछ और गलत हो गया है, लेकिन हम यह नहीं बता सकते कि क्या है। कृपया इसे प्रदर्शित करने वाला एक छोटा लेकिन पूर्ण कार्यक्रम बनाएं और फिर एक प्रश्न पूछें। मुझे संदेह है कि आपको पुन: पेश करने में मुश्किल होगी ...
जॉन स्कीट

1
@MusiGenesis: <code> (int) IGNORE_RATIO * वॉल्यूम </ कोड> की गणना <कोड> (int) 0.15 * वॉल्यूम </ code> के रूप में की जाती है, लेकिन टाइपकास्ट केवल अनुपात पर लागू होता है, उत्पाद का परिणाम नहीं, और आपको <कोड> 0 * वॉल्यूम </ कोड> मिलता है अर्थात शून्य! अपने बग को हल करने के बजाय <code> (int) (IGNORE_RATIO * वॉल्यूम) </ code> का उपयोग करें।
verdy_p

11

MSDN के अनुसार, Math.Floor (डबल) एक डबल रिटर्न करता है: http://msdn.microsoft.com/en-us/library/e0b5f0xb.aspx

यदि आप इसे इंट के रूप में चाहते हैं:

int result = (int)Math.Floor(yourVariable);

मैं देख सकता हूं कि एमएसडीएन लेख कैसे भ्रामक हो सकता है, उन्हें यह निर्दिष्ट करना चाहिए था कि परिणाम "पूर्णांक" है (इस मामले में पूरी संख्या का अर्थ है) यह अभी भी टाइप डबल है


आपके जवाब के लिए धन्यवाद। वास्तव में मैं इस लेख को देख रहा था: msdn.microsoft.com/en-us/library/e0b5f0xb.aspx लेकिन वैसे भी, मैं आपके सुझाव की कोशिश करूँगा। धन्यवाद।

यह सच है, यह शीर्ष पर कहता है "एक पूर्णांक लौटाता है" लेकिन इसका प्रकार नीचे निर्दिष्ट किया गया है: सार्वजनिक स्थैतिक डबल फ्लोर (डबल डी)
नील एन

3
पूर्णांक! = int( answers.com/integer ) - पूर्णांक में संग्रहीत किया जा सकता है Double(जॉन का उत्तर देखें), और पूर्णांकों की एक अनंत संख्या है जिन्हें एक में संग्रहीत नहीं किया जा सकता है int
शोग ९

शोग, मैंने कहा कि वे नहीं कर सकते। मैंने जो कहा वह "यह अभी भी टाइप डबल है"
नील एन

1
@ नील: सही - बस "पूर्णांक" (एक सेट का नाम) और int(एक प्रकार का नाम ) के बीच अंतर पर जोर देना चाहता था ।
शोग ९

4

यदि आपको किसी संख्या के पूर्णांक भाग की आवश्यकता है, तो संख्या को एक में डालें int। यह दशमलव बिंदु पर संख्या को काट देगा।

double myDouble = 4.6;
int myInteger = (int)myDouble;

2
यह नोट करना महत्वपूर्ण है कि नकारात्मक संख्याओं के लिए intअलग-अलग व्यवहार करना है FloorFloorहमेशा सबसे अधिक ऋणात्मक संख्या में intकाट
छाँट


0

मंजिल इसे एक डबल के रूप में छोड़ देता है ताकि आप इसके साथ अधिक दोहरी गणना कर सकें। यदि आप इसे इंट के रूप में चाहते हैं, तो फर्श के परिणाम को इंट के रूप में डालें। मूल डबल को इंट के रूप में मत डालें क्योंकि फर्श के नियम नकारात्मक संख्याओं के लिए अलग (IIRC) हैं।


0
Convert.ToInt32(Math.Floor(Convert.ToDouble(value)))

यह आपको सटीक मूल्य देगा कि आप क्या चाहते हैं यदि आप 4.6इसे 4आउटपुट के रूप में लेते हैं ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.