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
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; }