Haskell:
数字取整

如何进行:

Haskell 使用 Prelude 中的 roundceilingfloortruncate 函数进行四舍五入操作。

import Prelude

main :: IO ()
main = do
  let num = 3.567
  print $ round num    -- 4
  print $ ceiling num  -- 4
  print $ floor num    -- 3
  print $ truncate num -- 3
  
  -- 四舍五入到特定小数位并不在 Prelude 中。
  -- 这里是一个自定义函数:
  let roundTo n f = (fromInteger $ round $ f * (10^n)) / (10.0^^n)
  print $ roundTo 1 num -- 3.6

深入了解

历史上,在数值分析和计算机科学中,四舍五入非常重要,因为它对于最小化计算中的误差积累至关重要,特别是在浮点表示标准化为IEEE 754之前。

四舍五入到什么呢?round 将你带到最近的整数——向上或向下。ceilingfloor 总是向上或向下四舍五入到最接近的整数,而 truncate 仅仅是丢弃小数点。

除了这些函数之外,替代方法可能涉及自定义逻辑,如我们的 roundTo,或者你可能会引入库(如 Data.Fixed)以满足更复杂的需求。

注意由于 Haskell 如何处理 round 中的一半的情况可能导致的意外结果(它四舍五入到最近的偶数)。

另请参阅

  • Haskell Prelude 文档中的四舍五入函数:https://hackage.haskell.org/package/base-4.16.1.0/docs/Prelude.html
  • Haskell Wiki 上的浮点算术:https://wiki.haskell.org/Floating_point_arithmetic
  • IEEE 754-2008 标准,了解更多关于许多语言中如何处理浮点的信息:https://ieeexplore.ieee.org/document/4610935