整数浮动

dem*_*mas 19 floating-point haskell integer

此代码有效:

posToXY :: Float -> Float -> Integer
posToXY a b = do
        let y = a / b
        round y
Run Code Online (Sandbox Code Playgroud)

但这不起作用:

posToXY :: Integer -> Integer -> Integer
posToXY a b = do
        let y = a / b
        round y
Run Code Online (Sandbox Code Playgroud)

据我所知,操作"/"没有定义整型,但我不知道如何解决代码整数参数来工作.

C. *_*ann 28

如果要执行小数除法,可以Integral使用任何类型转换fromIntegral,或fromInteger仅转换为Integer特定类型.

有与其他数字类型类类似的功能:toRational,fromRational,realToFrac等等.当然,你可以使用转换小数类型回整型round,floor,ceiling,或者这样的.

最后,关于你实际上想要整数除法的概率,而不是后续舍入的小数除法,有divquot函数(取决于你想要的截断行为).

另外,你可能应该把你的函数写成类似的东西posToXY a b = round $ a / b.不必要的do多行使得阅读更加困难.


sep*_*p2k 7

您可以使用fromIntegral将任何Integral类型转换为任何Num类型.所以:

let y = fromIntegral a / fromIntegral b
Run Code Online (Sandbox Code Playgroud)


Dav*_*rke 7

您的代码可以轻松简化为

posToXY :: Float -> Float -> Integer
posToXY a b = round (a / b)
Run Code Online (Sandbox Code Playgroud)

然后

posToXY :: Integer -> Integer -> Integer
posToXY a b = round (fromIntegral a / fromIntegral b)
Run Code Online (Sandbox Code Playgroud)