/*
 *  call-seq:
 *     flt.round([ndigits])   => integer or float
 *
 *  Rounds <i>flt</i> to a given precision in decimal digits (default 0 digits).
 *  Precision may be negative.  Returns a a floating point number when ndigits
 *  is more than one.
 *
 *     1.5.round      #=> 2
 *     (-1.5).round   #=> -2
 */

static VALUE
flo_round(int argc, VALUE *argv, VALUE num)
{
    VALUE nd;
    double number, f;
    int ndigits = 0, i;
    long val;

    if (argc > 0 && rb_scan_args(argc, argv, "01", &nd) == 1) {
        ndigits = NUM2INT(nd);
    }
    number  = RFLOAT_VALUE(num);
    f = 1.0;
    i = abs(ndigits);
    while  (--i >= 0)
        f = f*10.0;

    if (ndigits < 0) number /= f;
    else number *= f;
    number = round(number);
    if (ndigits < 0) number *= f;
    else number /= f;

    if (ndigits > 0) return DOUBLE2NUM(number);

    if (!FIXABLE(number)) {
        return rb_dbl2big(number);
    }
    val = number;
    return LONG2FIX(val);
}