整数浮动

时间:2010-10-19 12:24:46

标签: haskell floating-point integer

此代码有效:

posToXY :: Float -> Float -> Integer
posToXY a b = do
        let y = a / b
        round y

但这不起作用:

posToXY :: Integer -> Integer -> Integer
posToXY a b = do
        let y = a / b
        round y

我理解操作'/'没有为Integer类型定义,但我不知道如何修复代码以使用Integer参数。

4 个答案:

答案 0 :(得分:27)

如果您要执行小数除法,可以使用IntegralfromIntegral从任何fromInteger类型进行转换,只能专门从Integer转换。

有与其他数字类型相关的类似功能:toRationalfromRationalrealToFrac等。当然,您可以使用{{1将小数类型转换回整数类型}},roundfloor等。

最后,关于你实际想要整数除法的概率,而不是事后舍入的小数除法,有ceilingdiv函数(取决于什么你想要的截断行为。

此外,您可能应该将您的功能编写为quot之类的内容。不必要的posToXY a b = round $ a / b和多行使得阅读更加困难。

答案 1 :(得分:7)

您可以使用fromIntegral将任何积分类型转换为任何Num类型。所以:

let y = fromIntegral a / fromIntegral b

答案 2 :(得分:7)

您的代码可以轻松简化为

posToXY :: Float -> Float -> Integer
posToXY a b = round (a / b)

然后

posToXY :: Integer -> Integer -> Integer
posToXY a b = round (fromIntegral a / fromIntegral b)

答案 3 :(得分:3)

如果您想要整数除法,可以使用div

posToXY :: Integer -> Integer -> Integer
posToXY = div

请注意,这与舍入浮点除法并不完全相同,因为div总是向下舍入。

对于更通用的类型签名,您可以改为执行此操作

p :: (Real a, Real a1, Integral b) => a -> a1 -> b
posToXY a b = round (realToFrac a / realToFrac b)