# 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) | |||

Line 5: | Line 5: | ||

== Solution == | == Solution == | ||

− | Use one of the | + | 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 |

<code> | <code> | ||

floor(X) -> | floor(X) -> | ||

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

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

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

− | + | false -> T | |

− | + | ||

end. | end. | ||

ceiling(X) -> | ceiling(X) -> | ||

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

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

− | + | true -> T; | |

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

− | + | ||

end. | end. | ||

Line 28: | Line 26: | ||

2> ceiling(-4.3). | 2> ceiling(-4.3). | ||

-4 | -4 | ||

− | 3> | + | 3> trunc(-4.3). |

-4 | -4 | ||

− | 4> | + | 4> round(-4.3). |

-4 | -4 | ||

5> floor(3.5). | 5> floor(3.5). | ||

Line 36: | Line 34: | ||

6> ceiling(3.5). | 6> ceiling(3.5). | ||

4 | 4 | ||

− | 7> | + | 7> trunc(3.5). |

3 | 3 | ||

− | 8> | + | 8> round(3.5). |

4 | 4 | ||

− | 9> | + | 9> round(7). |

7 | 7 | ||

</code> | </code> | ||

Line 46: | Line 44: | ||

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. | |

− | floor returns the largest integer not larger than x. | + | floor/1 returns the largest integer not larger than x. |

− | ceiling returns the smallest integer not smaller than x. | + | ceiling/1 returns the smallest integer not smaller than x. |

− | + | trunc/1 returns the integer closest to x whose absolute value is not larger than the absolute value of x. | |

− | + | ||

− | + | ||

− | + | ||

− | + | ||

Further general information on math and rounding is available from: | Further general information on math and rounding is available from: |

## Revision as of 15:17, 24 September 2006

## 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) -> T = trunc(X), case X - T < 0 of true -> T - 1; false -> T end. 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. floor/1 returns the largest integer not larger than x. ceiling/1 returns the smallest integer not smaller than x. trunc/1 returns the integer closest to x whose absolute value is not larger than the absolute value of x.

Further general information on math and rounding is available from:

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