3

浮動小数点数を含む文字列を読み取り、それをRationalに戻す必要がある関数を書いています。しかし、私がそうするときtoRational (read input :: Double)、それは例えば:期待通りに変わるのではなく0.99 % 10代わりに81 .....%9007 ... Thx

4

2 に答える 2

10

これは正しい動作です。番号は、Haskell、C、またはJavaではなく、0.9として表すことはできません。Doubleこれは、基数2DoubleFloat使用しているためです。これらは、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"

そして、結果:

> myReadFloat "0.9"
9 % 10
于 2010-04-01T00:37:30.117 に答える
2

2進浮動小数点数は、基数10で可能なすべての数を正確に表すことはできません。0.9として表示される数値は、正確には0.9ではなく、それに非常に近い数値です。小数の精度が必要な場合は、浮動小数点型を使用しないでください。使用できません。

于 2010-04-01T00:35:01.507 に答える