2009-07-22 39 views

Trả lời

24
isInt x = x == fromInteger (round x) 

> isInt 2 
True 
> isInt 2.5 
False 

Và chỉ là một lời nhắc nhở: luôn luôn nhớ lời nguyền toàn năng của số dấu chấm động:

> isInt (0.1^2*200) 
False 
> 0.1^2*200 
2.0000000000000004 
+0

mát mẻ, có tích hợp sẵn (ngoài tò mò) – Peter

+2

@Peter: không, theo Hoogle. – yairchu

+1

Lưu ý rằng 'isInt (1/0) == True' – hvr

15

Được rồi, vì vậy đây là một năm muộn, nhưng tôi là một fan hâm mộ lớn của một sửa đổi ở trên:

--Returns if x is an int to n decimal places 
isInt :: (Integral a, RealFrac b) => b -> a -> Bool 
isInt x n = (round $ 10^(fromIntegral n)*(x-(fromIntegral $ round x)))==0 

vì vậy, ví dụ isInt 4.0001 3 lợi nhuận True nhưng isInt 4.0001 4 lợi nhuận False. Chạy nó với một giá trị xung quanh 10 hầu như luôn đủ chính xác mà các lỗi phao sẽ là những gì cung cấp cho các vấn đề của bạn một lần nữa; Tôi thường sử dụng 7.

Các vấn đề liên quan