我想采用 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/