Math.floor एक डबल क्यों लौटाता है?


104

आधिकारिक जावदॉक का कहना है कि Math.floor()एक double"गणितीय पूर्णांक के बराबर" रिटर्न है , लेकिन फिर इसे वापस क्यों नहीं करना चाहिए int?

जवाबों:


80

उसी जावदोक के अनुसार:

यदि तर्क NaNया अनंत या सकारात्मक शून्य या नकारात्मक शून्य है, तो परिणाम तर्क के समान है। एक के साथ ऐसा नहीं कर सकते int

सबसे बड़ा doubleमूल्य भी सबसे बड़ा है int, इसलिए यह एक होना होगा long


41
Math.Round फ़ंक्शन के साथ असंगत लगता है, जो इंट / लॉन्ग रिटर्न करते हैं और विशेष मामलों को एक अलग तरीके से संभालते हैं।
राशि

1
जावदोक का कहना है कि यह "सबसे बड़ा (सकारात्मक अनंत के निकटतम) * फ़्लोटिंग-पॉइंट वैल्यू * लौटाता है जो तर्क से कम या बराबर है और एक गणितीय पूर्णांक के बराबर है" । एक मान x> 2 ^ 53 को देखते हुए जो कि उसके अंश वाले भाग के मान के समान नहीं होगा। यह अच्छी तरह से की तुलना में काफी छोटा हो सकता है।
जिम गैरिसन

16

यह सटीकता के लिए है। डबल डेटा-टाइप में 53 बिट मंटिसा है। अन्य बातों के अलावा, इसका मतलब है कि एक डबल सटीक नुकसान के बिना पूरे 2 ^ 53 तक का प्रतिनिधित्व कर सकता है।

यदि आप एक पूर्णांक में इतनी बड़ी संख्या को संग्रहीत करते हैं तो आपको एक अतिप्रवाह मिलेगा। इंटीजर में केवल 32 बिट्स होते हैं।

पूर्णांक को एक डबल के रूप में वापस करना यहां सही काम है क्योंकि यह पूर्णांक की तुलना में बहुत अधिक उपयोगी नंबर-रेंज प्रदान करता है।


इस तरह के मूल्यों के साथ सामना करने के लिए, यह निश्चित रूप से लंबा लौट सकता है। आप अभी भी बाहर काम करने के लिए क्या करना होगा डबल्स के साथ> 2 ^ 63 हालांकि।
जॉन स्कीट

1
@ जो, सच है, लेकिन इसके परिणामस्वरूप एक प्रदर्शन प्रभाव होगा (किसी भी निर्देश सेट में लंबे समय तक डबल करने के लिए कोई रूपांतरण निर्देश नहीं है जो मुझे पता है)। मुझे आश्चर्य है कि मैथ.फ्लोअर युगल> 2 ^ 53 के साथ पहले स्थान पर है। कुछ परिणाम प्रतिनिधित्व योग्य नहीं हैं।
निल्स पिपेनब्रिनक

लेकिन फिर, छद्म मुहावरेदार रूप (int) Math.floor (foo), जो आधिकारिक javadoc में भी दिखाई देता है क्योंकि परिणाम एक int में फिट नहीं हो सकता है, क्या मैं सही हूँ? और फिर फिर से, जो कि Math.floor का उपयोग करने के लिए एक सुरक्षित रूप है, क्योंकि परिणाम लंबे समय तक भी फिट नहीं हो सकता है?
रायबज

10

दूसरों ने आपको बताया है कि क्यों, मैं आपको यह बताने जा रहा हूं कि आप कैसे सही तरीके से गोल करना चाहते हैं। यदि आप केवल सकारात्मक संख्याओं का उपयोग करने जा रहे हैं, तो आप इस कथन का उपयोग कर सकते हैं:

int a=(int) 1.5;

हालाँकि, (int) हमेशा 0 की ओर गोल होता है। इस प्रकार, यदि आप एक ऋणात्मक संख्या करना चाहते हैं:

int a=(int) -1.5; //Equal to -1

मेरे मामले में, मैं ऐसा नहीं करना चाहता था। मैंने राउंडिंग करने के लिए निम्न कोड का उपयोग किया, और यह सभी किनारे के मामलों को अच्छी तरह से संभालने के लिए लगता है:

private static long floor(double a)
{
    return (int) Math.floor(a);
}

7
उपयोग क्यों नहीं (int) Math.floor(a)? यह शायद अधिक कुशल है और यह छोटा है।
सोलोमन उको

यदि आप सकारात्मक है तो इसके बजाय @ सोलोमन उको (int) Math.floor(a)बस लिख सकते हैं (int) a
लियो लिट्टेव

3

यदि आप इसे सबसे बड़े इंट या लंबे समय से दोगुना बड़ा देंगे, तो आप क्या चाहते हैं?

(माना जाता है कि अगर यह सबसे बड़ा लंबे समय की तुलना में बड़ा है, तो सटीकता वैसे भी कम होगी - यह निकटतम सैद्धांतिक पूर्णांक नहीं हो सकता है - लेकिन ऐसा ...)


0

जिस तरह जावा में एक पूर्णांक और एक फ्लोटिंग पॉइंट डिवीज़न होता है, उसी तरह फ़्लोर करने के लिए पूर्णांक और फ़्लोटिंग पॉइंट तरीके होते हैं:

double f = Math.floor(x);

या

int k = (int) x; 

लेकिन आपको हमेशा परिमित परिशुद्धता अंकगणित के साथ फर्श का उपयोग करने में सावधानी बरतने की आवश्यकता है: एक्स की आपकी गणना में 1.99999999 जैसी कुछ उपज हो सकती है जो कि दोनों रूपों द्वारा 2 के लिए नहीं 1 से 1 तक फ़्लार की जाएगी। वहाँ कई एल्गोरिदम हैं जो कुछ इनपुट मूल्यों के लिए गलत परिणाम उत्पन्न करने से बचने के लिए इस सीमा के आसपास काम करने की आवश्यकता है।


0

ताकि गणना की एक श्रृंखला के माध्यम से त्रुटि और अन्य गैर पूर्णांक मान सही ढंग से कैस्केड कर सकें।

उदाहरण के लिए, यदि आप Math.floor में Not (संख्या) नहीं दर्ज करते हैं, तो वह इसे पास कर देगा।

यदि यह पूर्णांक लौटा तो यह इन स्थितियों या त्रुटियों को पास नहीं कर सकता है, और आप पहले की गणना से बुरे परिणाम प्राप्त कर सकते हैं जो अच्छे लगते हैं लेकिन आगे की प्रक्रिया के लिए गलत हैं।

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