Erlang Central

Floating Point Rounding

From ErlangCentral Wiki


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


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

-export([floor/1, ceiling/1]).

floor(X) when X < 0 ->
    T = trunc(X),
    case X - T == 0 of
        true -> T;
        false -> T - 1
floor(X) -> 

ceiling(X) when X < 0 ->
ceiling(X) ->
    T = trunc(X),
    case X - T == 0 of
        true -> T;
        false -> T + 1

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