Haskell:
Округление чисел
Как:
Haskell использует функции round
, ceiling
, floor
и truncate
из Prelude
для операций округления.
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
направляет к ближайшему целому числу — вверх или вниз. ceiling
и floor
всегда округляют вверх или вниз до ближайшего целого числа соответственно, в то время как 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