Haskell:Force浮动有两位小数

And*_*ers 30 floating-point precision haskell

使用以下代码段:

(fromIntegral 100)/10.00
Run Code Online (Sandbox Code Playgroud)

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

谢谢.

via*_*tic 54

仅供记录:

import Numeric 
formatFloatN floatNum numOfDecimals = showFFloat (Just numOfDecimals) floatNum ""
Run Code Online (Sandbox Code Playgroud)

  • IMO这个答案应该是公认的答案. (10认同)

Ste*_*202 24

您可以使用printf :: PrintfType r => String -> rText.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
Run Code Online (Sandbox Code Playgroud)

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

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

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

在这种情况下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"
Run Code Online (Sandbox Code Playgroud)

  • 我将重新解释这个问题:-)我想返回一个带有两个decimans的float的字符串表示 - 而不是将它打印到stdout.我在Haskell的'sprintf'函数中找不到任何具体的东西,就像我希望的那样.任何提示? (2认同)