# Difference between revisions of "Floating Point Rounding"

From ErlangCentral Wiki

(these BIFs don't need erlang: ; change the tests a bit; remove bogus scheme reference to inexactness; remove redundant 'see also'; minor language) | |||

(3 intermediate revisions by 3 users not shown) | |||

Line 8: | Line 8: | ||

<code> | <code> | ||

− | floor(X) -> | + | floor(X) when X < 0 -> |

T = trunc(X), | T = trunc(X), | ||

− | case X - T | + | case X - T == 0 of |

− | true -> T | + | true -> T; |

− | false -> T | + | 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), | ||

− | case X - T | + | case X - T == 0 of |

true -> T; | true -> T; | ||

false -> T + 1 | false -> T + 1 | ||

end. | end. | ||

+ | |||

1> floor(-4.3). | 1> floor(-4.3). | ||

Line 44: | Line 50: | ||

The procedures all return integers. | The procedures all return integers. | ||

− | round/1 returns the closest integer to x, rounding to even when x is halfway between two 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. | floor/1 returns the largest integer not larger than x. | ||

ceiling/1 returns the smallest integer not smaller 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: | 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