2011-02-19 39 views
8

當評估表達式:Haskell中:用於表達的意外的輸出[0,0.1。1]

*main> [0, 0.1 .. 1] 

我其實期望:

[0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1] 

但是我很驚訝地看到的輸出被

[0.0,0.1,0.2,0.30000000000000004,0.4000000000000001,0.5000000000000001,0.6000000000000001,0.7000000000000001,0.8,0.9,1.0] 

爲什麼會產生哈斯克爾該結果時評價?

+0

可能的重複[爲什麼ghci說1.1 + 1.1 + 1.1> 3.3是真的?](http://stackoverflow.com/questions/2038647/why-does-ghci-say-that-1-1- 1-1-1-1-3-3-is-true) – Gabe 2011-02-19 05:04:53

回答

19

這是floating point值的不精確的結果,它是並非特定的Haskell。如果你不能在浮點固有的近似處理,那麼你可以在一個高性能的成本使用Rational

> import Data.Ratio 
Data.Ratio> [0,1%10.. 1%1] 
[0 % 1,1 % 10,1 % 5,3 % 10,2 % 5,1 % 2,3 % 5,7 % 10,4 % 5,9 % 10,1 % 1] 

只是錘點回家,這裏的Python:

>>> 0.3 
0.29999999999999999 

而這裏的C:

void main() { printf("%0.17f\n",0.3); } 

$ gcc t.c 2>/dev/null ; ./a.out 
0.29999999999999999