我希望能够以与您在Java中类似的方式截断float
或double
:(int)5.583
。
我做了一些研究,据我所知,Prelude中没有任何内容可以导入。所以我想知道如何构建一个能够完成它的函数。我想也许如果我做了show 5.583
然后将子字符串带到小数点然后将其转换为Int
,但这似乎只在使用递归时非常低效。那么有更简单的方法吗?
答案 0 :(得分:7)
我希望能够截断
float
或double
令人欣喜的是,将小数截断为积分的函数命名为" truncate"。
https://www.stackage.org/haddock/lts-8.4/base-4.9.1.0/Prelude.html#v:truncate
λ> truncate 5.583
5
其类型是
truncate :: (Real a, Fractional a, Integral b) => a -> b
这只是一个普通的功能。 Haskell没有任何语言功能(或kludge,如果你愿意的话)类似于Java中的类型转换。
答案 1 :(得分:2)
使用ghc转换浮点数是可能的:
λ> :m GHC.Float
λ> :t float2Double
float2Double :: Float -> Double
λ> :t double2Float
double2Float :: Double -> Float
λ> :t double2Int
double2Int :: Double -> Int
λ> :t float2Int
float2Int :: Float -> Int
λ> :t int2Double
int2Double :: Int -> Double
λ> :t int2Float
int2Float :: Int -> Float
但是对于整数的浮点数,我建议使用ceiling
,round
和floor
以及fromIntegral
进行反向转换。
编辑:在仔细阅读问题之后,@ Chris Martin的回答是正确的:
λ> :t truncate
truncate :: (Integral b, RealFrac a) => a -> b