2015-02-11 5 views
20

मुझे यह जांचने की ज़रूरत है कि क्या डबल-डिफ़ाइंड वैरिएबल इंट में परिवर्तनीय है, इसके मूल्य को खोए बिना।जांचना कि क्या डबल मान एक पूर्णांक है - स्विफ्ट

if self.value == Int(self.value) 

जहां self.value एक डबल है: यह क्योंकि वे विभिन्न प्रकार के होते हैं काम नहीं करता।

उत्तर

39

कोशिश 'फर्श' डबल मूल्य तो पता चल सके कि यह अपरिवर्तित है:

let dbl = 2.0 
let isInteger = floor(dbl) == dbl // true 

विफल रहता है यह एक पूर्णांक नहीं है

let dbl = 2.4 
let isInteger = floor(dbl) == dbl // false 
+1

यह पूरा नहीं करता है ऐसा हल प्रश्न * "... अगर एक डबल परिभाषित चर इसके मूल्य को खोए बिना int में परिवर्तनीय है। "*। उदाहरण के लिए, यह 3.1e100 के लिए सच है, लेकिन यह मान परिवर्तनीय नहीं है 'Int' क्योंकि यह बहुत बड़ा है। –

27

जांच अगर % 1 शून्य है:

स्विफ्ट 3:

let dbl = 2.0 
let isInteger = dbl.truncatingRemainder(dividingBy: 1) == 0 

स्विफ्ट 2:

let dbl = 2.0 
let isInteger = dbl % 1 == 0 
+2

यह अच्छा होगा अगर आप कुछ और जानकारी जोड़ सकते हैं, '% 1' क्या करता है। मुझे लगता है कि कोड को समझने के लिए और लोगों की मदद करेगा। – Christian

+0

वह मॉड्यूल ऑपरेटर के रूप में जाना जाता है: https://en.wikipedia.org/wiki/Modulo_operation – newshorts

16

स्विफ्ट 3

if dbl.truncatingRemainder(dividingBy: 1) == 0 { 
    //it's an integer 
} 
0

का उपयोग आधुनिक (%) अब काम नहीं करेगा।

अब आप उपयोग कर सकते हैं:

let dbl = 2.0 
let isInteger = dbl.truncatingRemainder(dividingBy: 1.0) == 0.0 
1

कैसे (जो बंद दशमलव कट जाएगा) एक डबल करने के लिए एक इंट के लिए दो बार परिवर्तित, फिर वापस, तो मूल डबल करने के लिए इस तुलना के बारे में? उदाहरण के लिए:

var dbl:Double = 22/3 
dbl == Double(Int(dbl)) 
// false: dbl = 7.33333... Double(Int(dbl)) = 7.0 

dbl = 25 
dbl == Double(Int(dbl)) 
// true: dbl = 25.0, Double(Int(dbl)) = 25.0 
3

एक छोटा सा विस्तार इस के लिए जाँच करने के लिए:

extension FloatingPoint { 
    var isInt: Bool { 
     return floor(self) == self 
    } 
} 

तो बस

let anInt = 1.isInt 
let nonInt = 3.142.isInt 
संबंधित मुद्दे