Erlang Central

Difference between revisions of "Floating Point Rounding"

From ErlangCentral Wiki

Line 8: Line 8:
  
 
<code>
 
<code>
floor(X) ->
+
floor(X) when X < 0 ->
 
     T = trunc(X),
 
     T = trunc(X),
 
     case X - T == 0 of
 
     case X - T == 0 of
 
         true -> T;
 
         true -> T;
 
         false -> T - 1
 
         false -> T - 1
     end.
+
     end;
 +
floor(X) ->
 +
    trunc(X).
 +
 
  
 +
ceiling(X) when X < 0 ->
 +
    trunc(X);
 
ceiling(X) ->
 
ceiling(X) ->
 
     T = trunc(X),
 
     T = trunc(X),
Line 21: Line 26:
 
         false -> T + 1
 
         false -> T + 1
 
     end.
 
     end.
 +
  
 
1> floor(-4.3).
 
1> floor(-4.3).
Line 50: Line 56:
  
 
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.
 
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:  
 
Further general information on math and rounding is available from:  

Revision as of 19:25, 20 November 2009

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

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