2014-01-17 31 views
1

如采取4(迭代(0.001)1.0),得到的答复是[1.0,1.001,1.0019999999999998,1.0029999999999997]迭代并且使用迭代函数四舍五入在Haskell

但希望为0.001和答案的增量如[1.0,1.001,1.002,1.003]如何舍弃值?

在此先感谢

+0

你是否反对使用有理数类型? – DiegoNolan

+0

没有任何数字可以表示为一个浮点数,它可以给你你想要的。 0.001不能精确表示,你可以选择的下一个数字给出不同的答案会超出你想要的结果。浮点很难。 – augustss

回答

3

您可以使用Data.Fixed

import Data.Fixed 

xs1 = take 4 $ iterate (+0.001) (1.0::Fixed E3) 

-- or you can use Enum instance for (Fixed a) also 
xs2 = take 4 [1.0::Fixed E3, 1.001..] 
0

这可以用理性来完成,以及修正:

x = take 4 $ map (fromRational) [1.000::Rational, 1.001..] 

这也可能是有用的,因为理性五月比较容易操作,例如:

map (logBase 10 . fromRational) $ take 4 [1.000::Rational, 1.001..]