Method: BigDecimal#n_significant_digits
- Defined in:
- bigdecimal.c
#n_significant_digits ⇒ Integer
Returns the number of decimal significant digits in self
.
BigDecimal("0").n_significant_digits # => 0
BigDecimal("1").n_significant_digits # => 1
BigDecimal("1.1").n_significant_digits # => 2
BigDecimal("3.1415").n_significant_digits # => 5
BigDecimal("-1e20").n_significant_digits # => 1
BigDecimal("1e-20").n_significant_digits # => 1
BigDecimal("Infinity").n_significant_digits # => 0
BigDecimal("-Infinity").n_significant_digits # => 0
BigDecimal("NaN").n_significant_digits # => 0
711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 |
# File 'bigdecimal.c', line 711
static VALUE
BigDecimal_n_significant_digits(VALUE self)
{
ENTER(1);
Real *p;
GUARD_OBJ(p, GetVpValue(self, 1));
if (VpIsZero(p) || !VpIsDef(p)) {
return INT2FIX(0);
}
ssize_t n = p->Prec; /* The length of frac without trailing zeros. */
for (n = p->Prec; n > 0 && p->frac[n-1] == 0; --n);
if (n == 0) return INT2FIX(0);
DECDIG x;
int nlz = BASE_FIG;
for (x = p->frac[0]; x > 0; x /= 10) --nlz;
int ntz = 0;
for (x = p->frac[n-1]; x > 0 && x % 10 == 0; x /= 10) ++ntz;
ssize_t n_significant_digits = BASE_FIG*n - nlz - ntz;
return SSIZET2NUM(n_significant_digits);
}
|