Haskell: 强制浮点数保留两位小数

33

使用下面的代码片段:

(fromIntegral 100)/10.00

使用Haskell '98标准预定义函数,我该如何将结果表示为两位小数?

谢谢。


它应该表示为字符串。即10.00。 - Anders
2个回答

57

仅供记录:

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

@NikitaVolkov 完成了。晚做总比不做好;-) - Anders
四个月后,LOL。:-D - Vanson Samuel

27

您可以使用来自Text.Printfprintf :: PrintfType r => String -> r:

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"

2
我来重新表述一下问题 :-) 我想返回一个浮点数的字符串表示,恰好有两个小数位 - 而不是将其打印到标准输出。我在Haskell中找不到任何关于类似'sprintf'函数的具体信息,就像我所希望的那样。有什么提示吗? - Anders
尝试将浮点数四舍五入后再打印输出? - Jared Updike

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接