स्विफ़्ट को इंट में स्विफ्ट में बदलें


198

मैं एक परिवर्तित करना चाहते हैं Floatएक करने के लिए Intस्विफ्ट में। इस तरह की बेसिक कास्टिंग काम नहीं करती है क्योंकि ऑब्जेक्टिव-सी में floatएस और intएस के विपरीत ये प्रकार आदिम नहीं हैं

var float: Float = 2.2
var integer: Int = float as Float

लेकिन यह निम्न त्रुटि संदेश उत्पन्न करता है:

'फ्लोट' 'इंट' के लिए परिवर्तनीय नहीं है

किसी भी विचार कैसे संपत्ति से परिवर्तित करने के लिए Float करने के लिए Int?


2
asऑपरेटर उपवर्गों के लिए नीचे कास्टिंग के लिए है। अर्थात्:UIView as UIButton
जैक

2
स्विफ्ट में, आप कीवर्ड का उपयोग करके टाइपिंग कर सकते हैं या 4 (जैसे?) जैसे वैकल्पिक का उपयोग कर सकते हैं? स्ट्रिंग, अगर 4 एक स्ट्रिंग हो सकती है तो यह काम करेगा लेकिन अगर यह नहीं है तो यह काम नहीं करेगा। मैं इसे ऊपर लाता हूं क्योंकि आप अपने प्रश्न में "कास्टिंग" शब्द का उपयोग करते हैं और मैं नहीं चाहता था कि आप भ्रमित हों। : 3
ए'ए डिकेंस

आपके कोड का कोई मतलब नहीं है। (फ्लोट के रूप में फ्लोट) कुछ भी नहीं करता है क्योंकि फ्लोट पहले से ही फ्लोट प्रकार का है। आपको या तो var पूर्णांक से मतलब था: Int = float (समान त्रुटि) या var पूर्णांक: Int = float as Int।
gnasher729

जवाबों:


317

आप परिवर्तित कर सकते हैं Floatकरने के लिए Intइस तरह स्विफ्ट में:

var myIntValue:Int = Int(myFloatValue)
println "My value is \(myIntValue)"

आप इस परिणाम को @ paulm की टिप्पणी के साथ भी प्राप्त कर सकते हैं:

var myIntValue = Int(myFloatValue)

@paulm - मैंने कोशिश नहीं की थी (टिप्पणी में कोड से ऊपर) । लेकिन हो सकता है कि यह हमारे लिए काम करेगा (निश्चित नहीं)
iPatel

4
चर प्रकार को घुमाने के लिए स्विफ्ट कंपाइलर के लिए कास्ट पर्याप्त है, इसलिए आपको प्रकार को स्पष्ट रूप से घोषित करने की आवश्यकता नहीं है। var myIntValue = Int(myFloatValue)काम करता है।
टिम सुलिवन

(स्विफ्ट 2.0) यह जांचना बेहतर है कि क्या फ्लोट मान एक परिमित मूल्य है, अगर myFloatvalue.isFinite {...}
ZYiOS

116

स्पष्ट रूपांतरण

Int में परिवर्तित करने से कोई भी सटीकता (प्रभावी रूप से राउंडिंग डाउन) खो जाएगी। गणित पुस्तकालयों तक पहुँच कर आप स्पष्ट रूपांतरण कर सकते हैं। उदाहरण के लिए:

आप करना चाहते हैं तो दौर नीचे और पूर्णांक में बदलने का:

let f = 10.51
let y = Int(floor(f))

परिणाम 10 है।

यदि आप चाहते थे को ख़त्म कर और पूर्णांक में बदलने का:

let f = 10.51
let y = Int(ceil(f))

परिणाम 11 है।

यदि आप स्पष्ट रूप से निकटतम पूर्णांक के लिए गोल करना चाहते हैं

let f = 10.51
let y = Int(round(f))

परिणाम 11 है।

बाद के मामले में, यह पांडित्यपूर्ण लग सकता है, लेकिन यह शब्दार्थ से स्पष्ट है क्योंकि इसमें कोई अंतर्निहित रूपांतरण नहीं है ... यदि आप उदाहरण के लिए सिग्नल प्रोसेसिंग कर रहे हैं तो यह महत्वपूर्ण है।


3
हाँ, यह वास्तव में ध्यान देने योग्य है कि इंट () बस आंशिक भाग को काटता है, जो आमतौर पर वांछित व्यवहार नहीं है;) इंट (गोल (एफ)) काम करता है।
ग्रेजेर्गज डी।

1
या छत () मूल्य को ऊपर की ओर गोल करने के लिए।
विंसेंट

एज केस:round(10.5) == 11.0
itMaxence

26

परिवर्तित सरल है:

let float = Float(1.1) // 1.1
let int = Int(float) // 1

लेकिन यह सुरक्षित नहीं है:

let float = Float(Int.max) + 1
let int = Int(float)

एक अच्छा दुर्घटना के कारण होगा:

fatal error: floating point value can not be converted to Int because it is greater than Int.max

इसलिए मैंने एक एक्सटेंशन बनाया है जो अतिप्रवाह को संभालता है:

extension Double {
    // If you don't want your code crash on each overflow, use this function that operates on optionals
    // E.g.: Int(Double(Int.max) + 1) will crash:
    // fatal error: floating point value can not be converted to Int because it is greater than Int.max
    func toInt() -> Int? {
        if self > Double(Int.min) && self < Double(Int.max) {
            return Int(self)
        } else {
            return nil
        }
    }
}


extension Float {
    func toInt() -> Int? {
        if self > Float(Int.min) && self < Float(Int.max) {
            return Int(self)
        } else {
            return nil
        }
    }
}

मुझे उम्मीद है कि यह किसी की मदद कर सकता है


26

परिशुद्धता के साथ संख्या को गोल करने के बहुत सारे तरीके हैं। आपको अंततः स्विफ्ट के मानक पुस्तकालय पद्धति का उपयोग करना चाहिएrounded() वांछित सटीकता के साथ फ्लोट संख्या को गोल लिए ।

उपयोग नियम को गोल करने के लिए .up:

let f: Float = 2.2
let i = Int(f.rounded(.up)) // 3

उपयोग नियम को समाप्त करने के लिए .down:

let f: Float = 2.2
let i = Int(f.rounded(.down)) // 2

के दौर के लिए निकटतम पूर्णांक उपयोग .toNearestOrEvenनियम:

let f: Float = 2.2
let i = Int(f.rounded(.toNearestOrEven)) // 2

निम्नलिखित उदाहरण से अवगत रहें:

let f: Float = 2.5
let i = Int(roundf(f)) // 3
let j = Int(f.rounded(.toNearestOrEven)) // 2

5

ऐशे ही:

var float:Float = 2.2 // 2.2
var integer:Int = Int(float) // 2 .. will always round down.  3.9 will be 3
var anotherFloat: Float = Float(integer) // 2.0

5

आप फ्लोट को इंटेगर इनिलाइज़र विधि में पास करके अपने फ्लोट का पूर्णांक प्रतिनिधित्व प्राप्त कर सकते हैं।

उदाहरण:

Int(myFloat)

ध्यान रखें, दशमलव बिंदु के बाद किसी भी संख्या का नुकसान होगा। मतलब, 3.9 एक इंट का 3 है और 8.99999 8 का पूर्णांक है।


7
और गोलाई के लिए Int (MyFloat + .5) का उपयोग करें।
जीन ले मोइगन


1

आप इस तरह कास्ट टाइप कर सकते हैं:

 var float:Float = 2.2
 var integer:Int = Int(float)

1

बस टाइप कास्टिंग का उपयोग करें

 var floatValue:Float = 5.4
 var integerValue:Int = Int(floatValue)

 println("IntegerValue = \(integerValue)")

यह राउंडऑफ मान दिखाएगा जैसे: IntegerValue = 5 का मतलब दशमलव बिंदु नुकसान होगा



0
var floatValue = 10.23
var intValue = Int(floatValue)

यह से परिवर्तित करने के लिए पर्याप्त floatहैInt


0

मान लीजिए कि आप फ्लोट वैल्यू को स्टोर "X"करते हैं और आप पूर्णांक मान को स्टोर कर रहे हैं "Y"

Var Y = Int(x);

या

var myIntValue = Int(myFloatValue)

-1

के Int64बजाय का उपयोग करें IntInt64बड़े अंतर मूल्यों को संग्रहीत कर सकते हैं।


आपका मतलब है, मूल प्रश्न के लिए, या उस Floatमूल्य के साथ समस्या के लिए, जिसका मूल्य सीमा से अधिक है Int?
benc
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.