浮動小数点数を含む文字列を読み取り、それをRationalに戻す必要がある関数を書いています。しかし、私がそうするときtoRational (read input :: Double)
、それは例えば:期待通りに変わるのではなく0.9
、9 % 10
代わりに81 .....%9007 ... Thx
質問する
1756 次
2 に答える
10
これは正しい動作です。番号は、Haskell、C、またはJavaではなく、0.9
として表すことはできません。Double
これは、基数2Double
を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"
そして、結果:
> myReadFloat "0.9"
9 % 10
于 2010-04-01T00:37:30.117 に答える
2
2進浮動小数点数は、基数10で可能なすべての数を正確に表すことはできません。0.9として表示される数値は、正確には0.9ではなく、それに非常に近い数値です。小数の精度が必要な場合は、浮動小数点型を使用しないでください。使用できません。
于 2010-04-01T00:35:01.507 に答える