Haskell:Force浮动有两位小数

时间:2009-10-13 11:15:48

标签: haskell floating-point precision

使用以下代码段:

(fromIntegral 100)/10.00

使用Haskell '98标准前奏,我如何用两位小数表示结果?

感谢。

2 个答案:

答案 0 :(得分:53)

仅供记录:

import Numeric 
formatFloatN floatNum numOfDecimals = showFFloat (Just numOfDecimals) floatNum ""

答案 1 :(得分:24)

您可以使用printf :: PrintfType r => String -> r中的Text.Printf

Prelude> import Text.Printf
Prelude Text.Printf> printf "%.2f\n" (100 :: Float)
100.00
Prelude Text.Printf> printf "%.2f\n" $ fromIntegral 100 / 10.00
10.00

%f将第二个参数格式化为浮点数。 %.2f表示只应打印小数点后面的两位数。 \n代表换行符。这个例子并不是绝对必要的。

请注意,此函数返回类型StringIO a的值,具体取决于上下文。示范:

Prelude Text.Printf> printf "%.2f" (1337 :: Float) ++ " is a number"
"1337.00 is a number"

在这种情况下,printf返回字符串"1337.00",因为结果作为参数传递给(++),这是一个需要列表参数的函数(注意String }与[Char])相同。因此,printf在其他语言中的行为也会sprintf。当然,没有必要附加第二个字符串等技巧。您可以只显式指定类型:

Prelude Text.Printf> printf "%.2f\n" (1337 :: Float) :: IO a  
1337.00
Prelude Text.Printf> printf "%.2f\n" (1337 :: Float) :: String
"1337.00\n"