protected int round()

in commons-math-legacy-core/src/main/java/org/apache/commons/math4/legacy/core/dfp/Dfp.java [1421:1493]


    protected int round(int n) {
        boolean inc = false;
        switch (field.getRoundingMode()) {
        case ROUND_DOWN:
            inc = false;
            break;

        case ROUND_UP:
            inc = n != 0;       // round up if n!=0
            break;

        case ROUND_HALF_UP:
            inc = n >= 5000;  // round half up
            break;

        case ROUND_HALF_DOWN:
            inc = n > 5000;  // round half down
            break;

        case ROUND_HALF_EVEN:
            inc = n > 5000 || (n == 5000 && (mant[0] & 1) == 1);  // round half-even
            break;

        case ROUND_HALF_ODD:
            inc = n > 5000 || (n == 5000 && (mant[0] & 1) == 0);  // round half-odd
            break;

        case ROUND_CEIL:
            inc = sign == 1 && n != 0;  // round ceil
            break;

        case ROUND_FLOOR:
        default:
            inc = sign == -1 && n != 0;  // round floor
            break;
        }

        if (inc) {
            // increment if necessary
            int rh = 1;
            for (int i = 0; i < mant.length; i++) {
                final int r = mant[i] + rh;
                rh = r / RADIX;
                mant[i] = r - rh * RADIX;
            }

            if (rh != 0) {
                shiftRight();
                mant[mant.length - 1] = rh;
            }
        }

        // check for exceptional cases and raise signals if necessary
        if (exp < MIN_EXP) {
            // Gradual Underflow
            field.setIEEEFlagsBits(DfpField.FLAG_UNDERFLOW);
            return DfpField.FLAG_UNDERFLOW;
        }

        if (exp > MAX_EXP) {
            // Overflow
            field.setIEEEFlagsBits(DfpField.FLAG_OVERFLOW);
            return DfpField.FLAG_OVERFLOW;
        }

        if (n != 0) {
            // Inexact
            field.setIEEEFlagsBits(DfpField.FLAG_INEXACT);
            return DfpField.FLAG_INEXACT;
        }

        return 0;
    }