alt*_*211 3 double rational-number haskell
我正在编写一个函数,我需要读取包含浮点数的字符串并将其转回Rational.但是,当我这样做时toRational (read input :: Double),它不会转向例如:0.9进入9 % 10预期,而是转向81 ......%9007 ... Thx
Die*_*Epp 10
这是正确的行为.该数字0.9不能表示为a Double,而不是Haskell,C或Java.这是因为Double并Float使用基数2:它们只能准确地表示二元分数的某个子集.
要获得所需的行为,请导入Numeric模块并使用该readFloat功能.界面相当不稳定(它使用的ReadS类型),所以你必须稍微包装它.以下是如何使用它:
import Numeric
myReadFloat :: String -> Rational -- type signature is necessary here
myReadFloat str =
case readFloat str of
((n, []):_) -> n
_ -> error "Invalid number"
Run Code Online (Sandbox Code Playgroud)
结果是:
> myReadFloat "0.9"
9 % 10
Run Code Online (Sandbox Code Playgroud)