Double和Rational Number的问题

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.这是因为DoubleFloat使用基数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)