แปลง Float เป็น Int ใน Swift


198

ฉันต้องการแปลง a Floatเป็นIntin Swift การร่ายพื้นฐานเช่นนี้ไม่ได้ผลเนื่องจากประเภทเหล่านี้ไม่ได้เป็นแบบพื้นฐานซึ่งแตกต่างจากfloats และints ใน Objective-C

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

แต่สิ่งนี้สร้างข้อความแสดงข้อผิดพลาดต่อไปนี้:

'Float' ไม่สามารถแปลงเป็น 'Int'

ความคิดใด ๆ วิธีการแปลงคุณสมบัติจากFloatถึงInt?


2
asผู้ประกอบการสำหรับการลงหล่อเพื่อ subclasses ie:UIView as UIButton
Jack

2
ใน swift คุณสามารถพิมพ์การหล่อโดยใช้คำหลักหรือเป็นทางเลือกเป็น (เป็น?) เช่น 4 เป็น? สตริงถ้า 4 สามารถเป็นสตริงมันจะทำงาน แต่ถ้าไม่ใช่มันจะไม่ทำงาน ฉันนำเรื่องนี้ขึ้นมาเพราะคุณใช้คำว่า "แคสติ้ง" ในคำถามของคุณและฉันไม่ต้องการให้คุณสับสน : 3
A'sa Dickens

รหัสของคุณไม่สมเหตุสมผล (float as Float) ไม่ทำอะไรเลยเพราะ float เป็นประเภท Float อยู่แล้ว คุณอาจหมายถึงจำนวนเต็ม var: Int = float (ข้อผิดพลาดเดียวกัน) หรือจำนวนเต็ม var: Int = float เป็น Int
gnasher729

คำตอบ:


317

คุณสามารถแปลงFloatเป็นIntSwift แบบนี้:

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

คุณสามารถบรรลุผลลัพธ์นี้ด้วยความคิดเห็นของ @ paulm:

var myIntValue = Int(myFloatValue)

@paulm - ผมไม่ได้พยายาม(เหนือรหัสในความคิดเห็น) แต่อาจจะมีก็จะทำงานให้เรา(ไม่แน่ใจ)
iPatel

4
คาสต์นั้นเพียงพอสำหรับคอมไพเลอร์ Swift เพื่อให้เหมาะสมกับชนิดตัวแปรดังนั้นคุณไม่จำเป็นต้องประกาศชนิดอย่างชัดเจน var myIntValue = Int(myFloatValue)โรงงาน
ทิมซัลลิแวน

(swift 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
ใช่มันคุ้มค่าจริงๆที่Int ()ตัดส่วนที่เป็นเศษส่วนซึ่งมักจะไม่ใช่พฤติกรรมที่ต้องการ;) Int (รอบ (f))ทำงาน
Grzegorz D.

1
หรือ ceil () เพื่อปัดค่าขึ้นด้านบน
Vincent

กรณีขอบ: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

มีหลายวิธีในการปัดเศษตัวเลขด้วยความแม่นยำ ในที่สุดคุณควรใช้วิธีไลบรารีมาตรฐานของ swift 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

คุณสามารถรับจำนวนเต็มแทน float ของคุณได้โดยส่ง float ไปยังวิธีการเริ่มต้น Integer

ตัวอย่าง:

Int(myFloat)

โปรดทราบว่าตัวเลขใด ๆ หลังจากจุดทศนิยมจะสูญเสีย ความหมาย 3.9 คือ Int ของ 3 และ 8.99999 เป็นจำนวนเต็ม 8


7
และใช้ Int (MyFloat + .5) เพื่อปัดเศษ
Jean Le Moignan


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)")

มันจะแสดงค่า roundoff เช่น: 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 สามารถเก็บค่า int ขนาดใหญ่IntInt64


คุณหมายถึงสำหรับคำถามดั้งเดิมหรือสำหรับปัญหาที่Floatมีช่วงค่ามากกว่าIntหรือไม่
benc
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.