16

मुझे एरे इंडेक्स की गणना के लिए CGFloatint पर फर्श या छत की आवश्यकता होती है।int से CGFloat को सुरक्षित रूप से फ़्लोर या छत कैसे करें?

समस्या जो मैं स्थायी रूप से floorf(theCGFloat) या ceilf(theCGFloat) के साथ देखता हूं वह यह है कि फ़्लोटिंग पॉइंट त्रुटियों के साथ समस्याएं हो सकती हैं।

तो क्या होगा यदि मेरा CGFloat2.0f है लेकिन आंतरिक रूप से इसे 1.999999999999f या ऐसा कुछ माना जाता है। मैं floorf करता हूं और 1.0f प्राप्त करता हूं, जो फिर से एक फ्लोट है। और फिर भी मुझे इस जानवर को int में डालना होगा जो एक और समस्या पेश कर सकता है।

वहाँ एक सबसे अच्छा अभ्यास करने के लिए कैसे फर्श या प्लस्तर लगाना है एक float के लिए एक int ऐसी है कि 2.0 की तरह कुछ गलती 1 और 2.0 की तरह कुछ करने के लिए फिदा हो कभी नहीं होगा गलती से 2 को ceiled मिल कभी नहीं होगा?

+4

इस प्रश्न का सही उत्तर नहीं किया जा सकता जब तक देखें विनिर्देशों इनपुट मूल्य में त्रुटि और क्या परिणाम मान जो भी कर रहे हैं लौटने के हैं का वर्णन प्रदान की जाती हैं उच्च या बहुत कम। ऐसे मूल्य को वापस करने के बीच ट्रेड-ऑफ हैं जो बहुत अधिक हैं क्योंकि पिछली राउंडिंग-त्रुटि ने मूल्य को बहुत अधिक बना दिया है और एक मान वापस कर दिया है जो बहुत कम है क्योंकि मान को कृत्रिम रूप से पिछली त्रुटि की क्षतिपूर्ति के लिए समायोजित किया गया था, और इसके विपरीत। संदर्भ के स्पष्टीकरण के बिना, कोई भी सही जवाब नहीं है। –

उत्तर

19

आपके प्रश्न में कुछ गलतफहमी हैं।

क्या हुआ अगर मेरी CGFloat 2.0f है, लेकिन आंतरिक रूप से यह 1.999999999999f के रूप में प्रस्तुत किया जाता है

ऐसा नहीं हो सकता; 2.0, सभी उचित रूप से छोटे पूर्णांक की तरह, फ़्लोटिंग-पॉइंट में सटीक प्रतिनिधित्व है। यदि आपका CGFloat2.0f है, तो यह वास्तव में 2.0 है।

कुछ की तरह 2.0 गलती से 2

के लिए कभी नहीं ceiled जायेगा

2.0 की छत 2 है, यह संभवतः और क्या होगा?


मुझे लगता है कि सवाल यह है कि क्या तुम सच में पूछ रहे हैं "है लगता है मैं एक गणना है कि एक अयथार्थ परिणाम है, जो गणितीय वास्तव में 2.0 होना चाहिए का उत्पादन करते हैं, लेकिन वास्तव में थोड़ा कम है, जब मैं floor पर लागू होते हैं वह मान, मुझे 2.0 के बजाय 1.0 मिलता है - मैं इसे कैसे रोकूं?"

वास्तव में एक काफी सूक्ष्म सवाल है कि एक ही नहीं है है कि" सही "जवाब। कैसे आप इनपुट मूल्य? आप परिणाम के साथ क्या करने जा रहे क्या?

1

संपादित करें - कारणों के लिए टिप्पणी पढ़ने क्यों यह जवाब सही :)

कास्टिंग एक float के लिए एक int एक अंतर्निहित floorf अर्थात (int)5.95 है नहीं है। यदि आपको कोई फर्क नहीं पड़ता है तो बस डालें :)

यदि आप गोल करना चाहते हैं तो बस ceilf का परिणाम डालें - गोल करने के बाद कास्टिंग किसी भी त्रुटि को शुरू नहीं करना चाहिए (या, यदि आप चाहते हैं, तो जोड़ें कास्टिंग करने से पहले यानी '(int) (5.9 + 1)' '6' है - राउंडिंग के समान)।

निकटतम तक जाने के लिए, बस 0.5 - (int)(5.9+0.5) जोड़ें 6 लेकिन (int)(5.4+0.5)5 है। हालांकि मैं केवल roundf(5.9) का उपयोग करता हूं :)

+8

int में फ़्लोट कास्टिंग एक अंतर्निहित मंजिल नहीं है। यह सी और कुछ अन्य आम भाषाओं में, एक छंटनी (शून्य की तरफ) है। तल नकारात्मक अनंत की दिशा में निकटतम पूर्णांक के लिए घूम रहा है। कनवर्टिंग -3.5 से पूर्णांक उपज -3, लेकिन मंजिल (-3.5) -4 है। –

+0

ठीक है, यह एक उचित बिंदु है - मैं सिर्फ गलत होने के बिंदु पर oversimplified :) – deanWombourne

18

स्विफ्ट पूरक जवाब गणना की है

मैं जो यहाँ आए एक CGFloat साथ floor और ceil उपयोग करने के लिए कैसे (जैसे मैंने किया था) तलाश के लिए एक पूरक जवाब के रूप में यह जोड़ने कर रहा हूँ।

var myCGFloat: CGFloat = 3.001 
floor(myCGFloat) // 3.0 
ceil(myCGFloat) // 4.0 

और यदि Int की आवश्यकता है, तो इसे एक पर डाला जा सकता है।

var myCGFloat: CGFloat = 3.001 
Int(floor(myCGFloat)) // 3 
Int(ceil(myCGFloat)) // 4 

अद्यतन

सी floor और ceil कार्यों और उपयोग कोई जरूरत नहीं है। आप rounding rules के साथ स्विफ्ट round() का उपयोग कर सकते हैं।

var myCGFloat: CGFloat = 3.001 
myCGFloat.round(.down) // 3.0 
myCGFloat.round(.up) // 4.0 

आप मूल चर को संशोधित करने की इच्छा नहीं है, तो rounded() का उपयोग करें।

नोट्स दोनों 32 और 64 बिट आर्किटेक्चर के साथ

  • काम करता है।

भी