我想计算0.2 * 0.2
,但结果不是0.04
。
>0.2 * 0.2
4.000000000000001e-2
我知道这种情况发生在任何编程语言中。 我想知道在Haskell中计算浮点数的最常用方法是什么?
与Java中的BigDecimal类似,
BigDecimal result = new BigDecimal("0.2").multiply(new BigDecimal("0.2"));
double value = result.doubleValue();
Haskell有这样的功能或技巧吗?
答案 0 :(得分:3)
这就是浮点运算的工作原理(在任何语言中,而不仅仅是Haskell),所以你不需要浮点数。例如,请参阅this question。
您可以使用Data.Ratio中的Rational
来处理完全有理数的数字:
ghci> import Data.Ratio
ghci> 0.2 :: Rational
1 % 5
ghci> 0.2 * 0.2 :: Rational
1 % 25
如果要将其转换回浮点(由于浮点的性质,也可能导致浮点错误),您可以使用Numeric
中的fromRat
:< / p>
ghci> import Numeric
ghci> fromRat ((0.2 * 0.2) :: Rational)
4.0e-2
这不是强制转换(Haskell没有强制转换,至少在这种意义上没有)。数字文字被重载,因此它们可以采用任何类型Num
类型的实例。现在没有必要完全理解这一点,但在某些方面了解和研究是很好的。
答案 1 :(得分:2)
除了 Rational 类型之外,您还可以查看numbers包。
特别是,有两种类型可能是有意义的:
要调查的其他软件包: