2015-02-11 24 views

Trả lời

39

Try 'sàn' giá trị tăng gấp đôi sau đó kiểm tra nếu nó là không thay đổi:

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

Thất bại nếu nó không phải là một số nguyên

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

này không hoàn thành giải quyết câu hỏi *" ... nếu một đôi biến được xác định có thể chuyển đổi thành Int mà không làm mất giá trị của nó. "*. Ví dụ, nó cho đúng 3.1e100, nhưng giá trị này không thể chuyển đổi thành 'Int' vì nó quá lớn. –

27

kiểm tra nếu % 1 là zero:

Swift 3:

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

Swift 2:

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

Sẽ rất tuyệt nếu bạn có thể thêm một số thông tin nữa, những gì '% 1' thực hiện. Tôi nghĩ điều đó sẽ giúp nhiều người hiểu mã hơn. – Christian

+0

anh ấy đang sử dụng cái được gọi là toán tử modulo: https://en.wikipedia.org/wiki/Modulo_operation – newshorts

16

Swift 3

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

Sử dụng mod (%) sẽ không làm việc nữa.

Bây giờ bạn có thể sử dụng:

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

Làm thế nào về chuyển đổi đúp để một Int (mà sẽ cắt đứt số thập phân), sau đó trở lại một đôi, sau đó so sánh này để Double gốc? Ví dụ:

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

Một phần mở rộng nhỏ để kiểm tra này:

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

Sau đó chỉ cần làm

let anInt = 1.isInt 
let nonInt = 3.142.isInt 
Các vấn đề liên quan