Haskell 四舍五入到最接近的整数奇怪的结果

Haskell 四舍五入到最接近的整数奇怪的结果,haskell,floating-point,Haskell,Floating Point,Haskell中的round函数是否有官方规范?在GHCi 7.0.3版中,我看到以下行为: ghci> round (0.5 :: Double) 0 ghci> round (1.5 :: Double) 2 由于0.5和1.5都可以精确地表示为浮点数,因此我希望看到与Python中相同的行为: >>> round(0.5) 1.0 >>> round(1.5) 2.0 这种差异是有原因的,还是GHCi的一个怪癖?在规范中。您可以在第6.4

Haskell中的
round
函数是否有官方规范?在GHCi 7.0.3版中,我看到以下行为:

ghci> round (0.5 :: Double)
0
ghci> round (1.5 :: Double)
2
由于0.5和1.5都可以精确地表示为浮点数,因此我希望看到与Python中相同的行为:

>>> round(0.5)
1.0
>>> round(1.5)
2.0

这种差异是有原因的,还是GHCi的一个怪癖?

在规范中。您可以在第6.4.6节中看到:

round x
返回与
x
最接近的整数,如果
x
为 两个整数之间的等距


正如所指出的,这符合。

这符合IEEE 754浮点舍入模式标准。如果有人感兴趣,下面是
round
的代码:对偶数的检查非常明显。FWIW,相比之下,python round()是C99 round()函数的包装,在C99附录F之后的实现中,它将ties从零舍入。@Poindexter链接已断开。链接万岁!请注意,Python3的行为方式与这里的GHCi相同。很有趣,谢谢。你知道为什么IEEE指定四舍五入为偶数吗?这对我来说似乎不太直观——无论是向上取整还是从零开始取整都更有意义。我想,如果你将一组数字四舍五入,然后将它们相加,舍入误差很可能会抵消…@ChrisTaylor是的,这是为了避免舍入带来的偏差。这通常被称为“银行家四舍五入”(不过,iirc在欧盟,金融应用中必须将零的一半舍入)。如果舍入距离为0的一半,则只有当值为半负半正时,它才会抵消,如果值为半到偶数,则抵消的频率更高。据我所知,舍入到偶数是科学标准。出于某种原因,四舍五入在小学很常见,但在其他方面,这只是另一种惯例。