# What is the simplest and most efficient way to find out if a given BigDecimal object is integral (4, 345.000) or fractional (4.35, 234234.5634) ?

Created May 4, 2012

**Doug Bell**

The only quick way to check for an integral `BigDecimal` is `BigDecimal.scale() == 0`. This check is quick, and if `true`, the `BigDecimal` has no fractional part. However, if `false`, the fractional part may still be zero (e.g. 10.0). So testing `BigDecimal.scale()` only tells you if there is a fractional part, but not whether the fractional part is zero.

The underlying representation for a `BigDecimal` is a
`BigInteger`, which is backed by a binary representation, so there is no quick and dirty means to determine if the fractional part is zero. Therefore, the "most efficient" (approximately) means to determine if the fractional part is zero is the following method (JDK 1.2 version):

private static final BigInteger bi10 = BigInteger.valueOf(10); boolean isIntegral (BigDecimal n) { int scale = n.scale(); // test for empty fractional part if (scale == 0) return true; BigInteger ni = n.unscaledValue(); // JDK 1.2 // test for n == 0 if (ni.signum() == 0) return true; // check if evenly divisible by 10^scale BigInteger pot = (scale == 1) ? bi10 : bi10.pow(scale); return ni.mod(pot).signum() == 0; }