如何将一个分数转换成Haskell中的数字列表?
我想取1/7(0.142857142857…)这样的值,并将其转换为“0.142857142857”或“142857142857”[1,4,2,8,5,7,1,4,2,8,5,7]。使用如何将一个分数转换成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 :: (RealFra
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,
...
当然,您可以从无限的数字列表中获取前缀。我想这是最简单的方法
showDigits :: Int -> Double -> String
showDigits n x = show (floor x) ++ "." ++ showRest n x
showRest :: Int -> Double -> String
showRest n x | n <= 0 = ""
| otherwise = digitToInt dig : showRest (pred n) x'
where dig = (floor x') `mod` 10
x' = x * 10
我想你需要:
例如,这将显示1/7到12位小数。它永远不会使用科学符号
Numeric.showFFloat (Just 12) (1/7) ""
顺便说一句,检查一下。另一种方法是,
(+)(-48)
可以写减法48
。如果你把数字交给1,这个函数有点滑稽<代码>数字(4%3)=[13,3,3,3,…])这个数字模块是什么?
import Data.Char
import Text.Printf
getDigits :: Double -> [Int]
getDigits=map ((subtract 48).Data.Char.ord) . (Text.Printf.printf "%f")
Numeric.showFFloat (Just 12) (1/7) ""