# Floating Point Rounding

From ErlangCentral Wiki

## Problem

You need to round a floating-point number to an integer.

## Solution

Use one of the functions **round/1**, **ceiling/1**, **floor/1** and **trunc/1**. Note, the standard Erlang distribution does not come with either **floor/1** or **ceiling/1**, but they can be easily implemented in terms of **trunc/1**

-module(fp). -export([floor/1, ceiling/1]). floor(X) when X < 0 -> T = trunc(X), case X - T == 0 of true -> T; false -> T - 1 end; floor(X) -> trunc(X). ceiling(X) when X < 0 -> trunc(X); ceiling(X) -> T = trunc(X), case X - T == 0 of true -> T; false -> T + 1 end.

1> fp:floor(-4.3). -5 2> fp:ceiling(-4.3). -4 3> trunc(-4.3). -4 4> round(-4.3). -4 5> fp:floor(3.5). 3 6> fp:ceiling(3.5). 4 7> trunc(3.5). 3 8> round(3.5). 4 9> round(7). 7

The procedures all return integers.

**round/1** returns the closest integer to x, rounding to even when x is halfway between two integers.
**trunc/1** returns the integer closest to x whose absolute value is not larger than the absolute value of x.
**floor/1** returns the largest integer not larger than x.
**ceiling/1** returns the smallest integer not smaller than x.

For the floor and ceiling functions implemented above, T will always be less than or equal to X. We just need to check if there is a difference between the two in which case we will either increase or decrease the truncation depending if we want to floor or ceiling X.

*(Correction to floor/1 and ceiling/1 to check for negative or positive values. 2009-11-21 seetho)*

Further general information on math and rounding is available from:

MathWorld definition of the Floor Function. MathWorld definition of the Ceiling Function