Haskell - 如何避免十进制输出中的科学记数法

时间:2016-05-03 14:00:30

标签: haskell number-formatting

我需要将数字列表除以100来打印,例如:

map (/100) [29, 3, 12]

产生:

[0.29,3.0e-2,0.12]

然而我需要:

[0.29,0.03,0.12]

我如何在Haskell中执行此操作?任何想法真的很感激。

3 个答案:

答案 0 :(得分:6)

0.033.0e-2的号码相同。在内部,GHC使用showFloat来打印它,只要绝对值超出0.1和9,999,999的范围,就会产生科学记数法。

因此,您必须自行打印值,例如Text.Printf中的printfNumeric中的showFFloat

import Numeric

showFullPrecision :: Double -> String
showFullPrecision x = showFFloat Nothing x ""

main = putStrLn (showFullPrecision 0.03)

根据您所需的输出,您需要编写更多功能。

答案 1 :(得分:1)

对我有用的是: 阴谋集团安装编号,然后在GHCi中输入

λ: import Data.Number.CReal
λ: map (/(100 :: CReal)) [29,3,12]
[0.29,0.03,0.12]

答案 2 :(得分:0)

非常感谢你的所有评论,现在我明白了我不介意使用变通方法的问题。代码是根据每个部分开始的时间找到音乐部分的长度 - 以1.28的形式持续1分28秒。现在结果是一个列表,其中时序为字符串,但这不是问题。对于任何感兴趣的人,这里有解决方法的功能:

subtractMinutes :: RealFrac a => [a] -> [[Char]]
subtractMinutes (x:xs) = take (length (xs)) (zz : subtractMinutes xs)
    where ya = (head(xs) - x) * 100
          ys = truncate (head(xs)) - truncate(x)
          yz = ya - (fromIntegral(ys) * 40)
          yx = round(yz)
          za = div yx 60
          zs = mod yx 60
          zz = show(za) ++ "." ++ zx
          zx = if zs < 10 then "0" ++ show(zs) else show(zs)