可能重复:
Haskell: Unexpected output for expression [0, 0.1 .. 1]
在Haskell中,有没有人知道以下结果的原因?
Prelude Data.List> map (\x -> x - 0.1) [0.2,0.3..0.9]
[0.1,0.19999999999999998,0.29999999999999993,0.3999999999999999,0.4999999999999999,0.5999999999999998,0.6999999999999996,0.7999999999999995]
而不是
[0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8]
答案 0 :(得分:11)
默认情况下,将为小数数据选择Double
(不精确但有效的数据类型)。如果您将其注释为使用Rational
,那么您可以获得准确的答案。
ghci> map (\x -> x - 0.1) [0.2,0.3..0.9] :: [Rational]
[1 % 10,1 % 5,3 % 10,2 % 5,1 % 2,3 % 5,7 % 10,4 % 5]
百分号用于表示精确分数,因此1 % 10
表示十分之一。