public static double doubleValue(int signNum, long intCompact, int scale) {
        int bitLength = 64 - Long.numberOfLeadingZeros(intCompact);
        long qb = bitLength - (long) Math.ceil(scale * L);
        if (qb < Q_MIN_D - 2) {  // qb < -1_076
            return signNum * 0.0;
        }
        if (qb > Q_MAX_D + P_D + 1) {  // qb > 1_025
            /* If s <= -309 then qb >= 1_027, so these cases all end up here. */
            return signNum * Double.POSITIVE_INFINITY;
        }

        if (scale == 0) {
            return signNum * (double) intCompact;
        }

        int ql = (int) qb - (P_D + 3);  // narrowing qb to an int is safe
        long i = MutableBigInteger.divideKnuthLong(intCompact, ql, scale);

        int dq = (Long.SIZE - (P_D + 2)) - Long.numberOfLeadingZeros(i);
        int eq = (Q_MIN_D - 2) - ql;
        if (dq >= eq) {
            return signNum * Math.scalb((double) (i | 1), ql);
        }

        /* Subnormal */
        long mask = (1L << eq) - 1;
        long j = i >> eq | Long.signum(i & mask) | 1;
        return signNum * Math.scalb((double) j, Q_MIN_D - 2);
    }
decimal is integer, check has non-zero small

@param decimal
@return
core/src/main/java/com/alibaba/fastjson2/util/TypeUtils.java