2010-04-01 77 views
3

我正在寫一個函數,我需要讀取一個包含浮點數的字符串並將其返回給Rational。但是當我做toRational (read input :: Double),也不會轉例如:0.99 % 10如預期,而是81%...... 9007 ...... THXDouble和Rational Number的問題

回答

10

這是正確的行爲。數字0.9不能表示爲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" 

而且,結果是:

> myReadFloat "0.9" 
9 % 10 
+0

有沒有正確處理負數的版本? – Martijn 2011-05-17 10:08:35

+0

如果要處理負數,請使用「readSigned readFloat」。 – Martijn 2011-05-17 10:14:29

1

二進制浮點數字不能精確代表所有的數字,基地-10可以。你看到0.9的數字不是,恰好是 0.9,但它非常接近它。不要在需要小數精度的情況下使用浮點類型 - 他們只是無法做到這一點。