/*
* 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);
}