Jeśli mam liczbę zmiennoprzecinkową w Haskell, to jak przetestować, czy jest to liczba całkowita.Jak sprawdzić, czy liczba zmiennoprzecinkowa jest liczbą całkowitą w haskell?
15
A
Odpowiedz
24
isInt x = x == fromInteger (round x)
> isInt 2
True
> isInt 2.5
False
I tylko przypomnienie: zawsze pamiętać wszechmocny klątwę z liczb zmiennoprzecinkowych:
> isInt (0.1^2*200)
False
> 0.1^2*200
2.0000000000000004
15
Ok, więc jest to rok późno, ale jestem wielkim fanem modyfikacji powyżej:
--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
Tak więc, na przykład isInt 4.0001 3
powraca True
ale isInt 4.0001 4
powraca False
. Uruchomienie go o wartości około 10
jest prawie zawsze na tyle dokładne, że błędy pływaka spowodują ponowne problemy; Zwykle używam 7
.
fajnie, czy jest wbudowany (z ciekawości)? – Peter
@Peter: nie, według Hoogle. – yairchu
Należy pamiętać, że 'isInt (1/0) == True' – hvr