Chuyển đổi Float thành Int trong Swift


198

Tôi muốn chuyển đổi Floatthành một Inttrong Swift. Đúc cơ bản như thế này không hoạt động vì các loại này không phải là nguyên thủy, không giống như floats và ints trong Objective-C

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

Nhưng điều này tạo ra thông báo lỗi sau:

'Float' không thể chuyển đổi thành 'Int'

Bất kỳ ý tưởng làm thế nào để chuyển đổi tài sản từ Floatđến Int?


2
các asnhà điều hành là cho xuống đúc để lớp con. tức là:UIView as UIButton
Jack

2
trong swift, bạn có thể thực hiện nhập kiểu bằng cách sử dụng từ khóa as hoặc tùy chọn như (như?), chẳng hạn như 4 như? Chuỗi, nếu 4 có thể là một chuỗi, nó sẽ hoạt động nhưng nếu không, nó sẽ không hoạt động. Tôi đưa ra điều này bởi vì bạn sử dụng từ "đúc" trong câu hỏi của bạn và tôi không muốn bạn bị nhầm lẫn. : 3
A'sa Dickens

Mã của bạn không có ý nghĩa. (float as Float) không làm gì cả vì float đã thuộc kiểu Float rồi. Bạn có nghĩa là số nguyên var: Int = float (cùng lỗi) hoặc var số nguyên: Int = float as Int.
gnasher729

Câu trả lời:


317

Bạn có thể chuyển đổi Floatsang Inttrong Swift như thế này:

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

Bạn cũng có thể đạt được kết quả này với nhận xét của @ paulm:

var myIntValue = Int(myFloatValue)

@paulm - Tôi chưa thử (mã trên trong bình luận) . nhưng có thể nó sẽ làm việc cho chúng tôi (không chắc chắn) .
iPatel

4
Dàn diễn viên đủ để trình biên dịch Swift giao tiếp với kiểu biến, do đó bạn không cần phải khai báo kiểu đó một cách rõ ràng. var myIntValue = Int(myFloatValue)làm.
Tim Sullivan

(swift 2.0) tốt hơn là kiểm tra xem giá trị float có phải là giá trị hữu hạn hay không, nếu myFloatvalue.isFinite {...}
ZYiOS

116

Chuyển đổi rõ ràng

Chuyển đổi sang Int sẽ mất bất kỳ độ chính xác nào (làm tròn hiệu quả). Bằng cách truy cập các thư viện toán học, bạn có thể thực hiện chuyển đổi rõ ràng. Ví dụ:

Nếu bạn muốn làm tròn xuống và chuyển đổi thành số nguyên:

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

kết quả là 10.

Nếu bạn muốn làm tròn và chuyển đổi thành số nguyên:

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

kết quả là 11.

Nếu bạn muốn làm tròn một cách rõ ràng đến số nguyên gần nhất

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

kết quả là 11.

Trong trường hợp thứ hai, điều này có vẻ như mô phạm, nhưng nó rõ ràng hơn về mặt ngữ nghĩa vì không có chuyển đổi ngầm ... quan trọng nếu bạn đang xử lý tín hiệu chẳng hạn.


3
Vâng, thực sự đáng chú ý rằng Int () chỉ đơn giản là cắt phần phân đoạn, thường không phải là hành vi mong muốn;) Int (round (f)) thực hiện công việc.
Grzegorz D.

1
Hoặc trần () để làm tròn giá trị lên trên.
Vincent

Trường hợp cạnh:round(10.5) == 11.0
itMaxence

26

Chuyển đổi rất đơn giản:

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

Nhưng nó không an toàn:

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

Sẽ do một vụ tai nạn tốt đẹp:

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

Vì vậy, tôi đã tạo một tiện ích mở rộng xử lý tràn:

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
        }
    }
}

Tôi hy vọng điều này có thể giúp ai đó


26

Có rất nhiều cách để làm tròn số với độ chính xác. Cuối cùng, bạn nên sử dụng phương pháp thư viện chuẩn của swiftrounded() để làm tròn số float với độ chính xác mong muốn.

Để vòng lên sử dụng .upquy tắc:

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

Để vòng xuống sử dụng .downquy tắc:

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

Để làm tròn đến quy tắc sử dụng số nguyên gần nhất.toNearestOrEven :

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

Hãy nhận biết ví dụ sau:

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

5

Như thế này:

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

Bạn có thể nhận được một đại diện số nguyên của float của bạn bằng cách chuyển float vào phương thức khởi tạo Integer.

Thí dụ:

Int(myFloat)

Hãy nhớ rằng, bất kỳ số nào sau dấu thập phân sẽ bị mất. Ý nghĩa, 3.9 là số nguyên của 3 và 8,9999 là số nguyên 8.


7
Và sử dụng Int (MyFloat + .5) để làm tròn.
Jean Le Moignan

4

Sử dụng chuyển đổi kiểu hàm (được tìm thấy trong phần có nhãn "Chuyển đổi số nguyên và dấu phẩy động" từ " Ngôn ngữ lập trình Swift. " [Liên kết iTunes])

  1> Int(3.4)
$R1: Int = 3

1

Bạn có thể gõ diễn viên như thế này:

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

1

Chỉ cần sử dụng kiểu đúc

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

 println("IntegerValue = \(integerValue)")

nó sẽ hiển thị giá trị làm tròn, ví dụ: IntegerValue = 5 có nghĩa là dấu thập phân sẽ bị mất



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

Điều này là đủ để chuyển đổi từ floatsangInt


0

Giả sử bạn lưu trữ giá trị float trong "X"và bạn đang lưu trữ giá trị nguyên trong "Y".

Var Y = Int(x);

hoặc là

var myIntValue = Int(myFloatValue)

-1

Sử dụng Int64thay vì Int. Int64có thể lưu trữ giá trị int lớn.


ý bạn là, đối với câu hỏi ban đầu, hoặc cho vấn đề Floatcó phạm vi giá trị lớn hơn Int?
benc
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.