haskell - 如何在 Haskell 中获取小数并将其转换为数字列表?

标签 haskell

我想采用 1/7 (0.142857142857...) 之类的值并将其转换为 "0.142857142857"或 "142857142857" [1,4,2,8,5,7,1 ,4,2,8,5,7]。使用

map ((+) (-48) . ord) . show

当分母较小时有效,但对于较大的分母,Haskell 开始使用科学记数法。如何一致地将小数转换为其数字列表?

最佳答案

这不是一个完整的解决方案,但它可以帮助您入门。这将获取 0 到 1 之间的数字的数字列表。使用适当的方法包装它,以获得您需要的格式的输出。

digits :: (RealFrac a) => a -> [Int]
digits 0 = []
digits x = d : digits (10*x - fromIntegral d)
    where
    d = floor (10*x)

尝试一下:

ghci> digits (1/4)
[2,5]
ghci> digits (1/3)
[3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,0,3,7,2,7,3,8,6,0,0,9,
 9,9,5,8,2,5,5,8,8,7,0,3,1,5,5,5,1,7,5,7,8,1,2,5]

-- rounding error got us, let's use an exact rational

ghci> import Data.Ratio
ghci> digits (1%3)
[3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,
...

当然,您可以从无限的数字列表中获取前缀。

关于haskell - 如何在 Haskell 中获取小数并将其转换为数字列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7694569/

相关文章:

file - 在 Haskell 中写入文件的开头

parsing - 高效地将 Foreign.Ptr Word8(或 ByteString)转换为 UArray Int Word8

haskell - Haskell 中的嵌套模式是什么?

Haskell 包版本控制策略 - 依赖项的变化

haskell - Haddock 丢失部分文档?

haskell - Haskell 和 Awesomium 的运行时 DLL 问题

function - 错误 - 推断类型不够通用

haskell - 如何将此 mergeWords 函数扩展到任意数量的字符串?

haskell - 如何编写结合其他 nix-shell 环境的 shell.nix 文件?

调试/检查函数内的值