我想轉換 a 浮點數(0,123456)并用 b (正整數)對其進行舍入。我使用 truncate 函式將浮點數四舍五入到特定長度“b”
這是我想出的公式,但是在使用 GHCI 編譯時出現錯誤
功能:
calcFloatingNum:: Double -> Int -> Int -> Float
calcFloatingNum a b = truncate ( a * 10^b) /10^b
錯誤代碼:
* No instance for (Integral Double)
arising from a use of `truncate'
* In the first argument of `(/)', namely `truncate (a * 10 ^ b)'
In the expression: truncate (a * 10 ^ b) / 10 ^ b
In an equation for `calcFloatingNum':
calcFloatingNum a b = truncate (a * 10 ^ b) / 10 ^ b
|
10 | calcFloatingNum a b = truncate ( a * 10^b) /10^b
如果我無論如何嘗試,它會說明:
ghci> calcFloatingNum 0.2345 2
<interactive>:1:1: error:
Variable not in scope: calcFloatingNum :: t0 -> t1 -> t
ghci>
所以簽名可能是問題所在,但我似乎找不到解決方案。
我嘗試使用“fromInteger”和“toInteger”轉換數字,但它也導致錯誤代碼。
uj5u.com熱心網友回復:
除了我在評論中提到的事情之外,這個問題實際上是一個遵循型別的練習,特別是浮點型別和整數型別。
讓我們從您嘗試使用的函式的型別簽名開始。我將使用具體型別來保持簡單。
truncate :: Double -> Int
(^) :: Int -> Int -> Int
如您所見,這些函式產生整數,而您需要浮點數。因此,每當我們使用這些函式時,我們需要使用fromIntegral :: Int -> Double將結果轉換回Double:
calcFloatingNum:: Double -> Int -> Double
calcFloatingNum a b =
fromIntegral (truncate (a * fromIntegral (10 ^ b))) / fromIntegral (10 ^ b)
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/532461.html
標籤:哈斯克尔类型转换
