2009-07-22 15 views
15

यदि मेरे पास हास्केल में एक फ़्लोटिंग पॉइंट नंबर है तो मैं परीक्षण कैसे करूं कि यह पूरी संख्या है या नहीं।यदि मैं एक फ्लोटिंग पॉइंट नंबर हैकेल में एक पूर्णांक है तो मैं कैसे परीक्षण करूं?

उत्तर

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

> isInt 2 
True 
> isInt 2.5 
False 

और बस एक चेतावनी: हमेशा चल बिन्दु संख्या के सर्वशक्तिमान अभिशाप याद रखें:

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

ठंडा, क्या होउगल के अनुसार – Peter

+2

@ पीटर: नहीं है। – yairchu

+1

ध्यान रखें कि 'isInt (1/0) == True' – hvr

15

ठीक है, तो यह एक साल देर हो चुकी है, लेकिन मैं एक संशोधन का एक बड़ा प्रशंसक हूँ इसके बाद के संस्करण:

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

तो, उदाहरण के लिए isInt 4.0001 3 रिटर्न True लेकिन isInt 4.0001 4 रिटर्न False। इसे 10 के आसपास मान के साथ चलाना लगभग हमेशा सटीक है कि फ्लोट-त्रुटियां आपकी समस्याओं को फिर से देती हैं; मैं आमतौर पर 7 का उपयोग करता हूं।

संबंधित मुद्दे