在程序中,我計算一個百分比並將其打印給用戶。問題在於打印的百分比顯示的小數過多。我搜索了一個函數來解決這個問題,沒有找到一個函數,並編程了下面的四捨五入函數,但我想知道是否有更標準的方法來做這件事。此外,this Java topic中描述的想法非常整潔,如果已經有功能可以做到這一點,我很想知道。Haskell:如何正確顯示最多兩位小數的百分比?
roundTo :: (Integral int1, Integral int2) => int1 -> Double -> Either int2 Double
roundTo digitsAfterComma value
| (digitsAfterComma >= 1) =
let
factor = fromIntegral (10^digitsAfterComma)
result = ((/ factor) . fromIntegral . round . (* factor)) value
in
Right result
| (digitsAfterComma == 0) = Left (round value)
| otherwise = error "minimal precision must be non-negative"
更新:更完整的版本如下,由我收到的答案開發。
import qualified Text.Printf as T
showPercentage :: (Integral a, Show a) => a -> Double -> String
showPercentage digitsAfterComma fraction
| (digitsAfterComma >= 1) =
let formatString = "%." ++ (show digitsAfterComma) ++ "f%%"
in T.printf formatString percentage
| (digitsAfterComma == 0) =
let formatString = "%d%%"
in T.printf formatString (round percentage :: Int)
| otherwise = error "minimal precision must be non-negative"
where percentage = 100 * fraction