【问题标题】:How to get a decimal string from a Double instead of scientific notation in Haskell?如何在 Haskell 中从 Double 而不是科学记数法中获取十进制字符串?
【发布时间】:2016-08-28 15:07:34
【问题描述】:

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

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

产生:

[0.29,3.0e-2,0.12]

不过我需要:

[0.29,0.03,0.12]

我如何在 Haskell 中做到这一点?任何想法都非常感谢。

【问题讨论】:

  • 3.0e-2 相当于 0.03。它们是相同的数字。您是在谈论打印这些数字还是完全其他内容?
  • 我知道 3.0e-2 相当于 0.03,我需要更常用的打印格式。 (每当我问一个问题时,我被打分了,我有没有惹恼别人?)
  • 这是一个格式问题(由Text.Printf.printf 处理)。关于你的问题的分数:标题和内容根本不匹配。一个更好的标题应该是“如何以某种格式显示小数”或“如何在小数输出中避免科学记数法”。
  • @JulesMazur:错误,0.0625 可以准确表示(它是 2^{-4}),但仍显示为 6.25e-2。只是当分隔符后的第一个数字为零时,DoubleShow 实例将切换到科学模式。
  • @IanStewart:没有。尝试(3 / 10) * 100000000000000000000000 并感到惊讶。

标签: haskell number-formatting


【解决方案1】:

对我有用的是: cabal 安装号码,然后在 GHCi 中

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

【讨论】:

  • 这只是使用不同的、通常不切实际的数字类型和不同的Show 实例。
  • 但它解决了例如this problem.
  • @WillNess,是的,但这是一个完全不相关的问题!
  • @dfeuer 原始问题除了“避免在十进制输出中使用科学记数法”之外没有其他限制
【解决方案2】:

非常感谢你们所有的 cmets,现在我明白了我不介意使用解决方法的问题。代码是根据每个部分开始的时间来查找音乐部分的长度 - 以 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)

【讨论】:

  • 为什么是take (length (xs))?这将删除最后一个元素。
  • 嗨 Zeta,我目前正在制作的音乐有 4 个部分,从 0.00 - 1.12 - 2.38 - 3.40 开始,到 5.28(分钟.秒)结束,产生 ["1.12","1.26 ","1.02","1.48"]。 4 个部分的函数需要 5 个元素。
【解决方案3】:

0.033.0e-2 是同一个数字。在内部,GHC 使用showFloat 打印它,这将导致当绝对值超出范围 0.1 和 9,999,999 时使用科学计数法。

因此,您必须自己打印值,例如使用来自Text.Printfprintf 或来自NumericshowFFloat

import Numeric

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

main = putStrLn (showFullPrecision 0.03)

根据你想要的输出,你需要编写更多的函数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-05
    • 1970-01-01
    • 2018-07-30
    • 1970-01-01
    相关资源
    最近更新 更多