Java Double Number Round round2(int a, int preserveDigits)

Here you can find the source of round2(int a, int preserveDigits)

Description

Math#round(double) -like operation for integers preserving the given number of digits in contrary to MathUtil#round(int,int) where cut-of-digits are specified:
return round(a, getDigits(a) - preserveDigits)

License

Open Source License

Parameter

Parameter Description
a - a value
preserveDigits - the number of digits to preserve

Return

the new value

Declaration

public static int round2(int a, int preserveDigits) 

Method Source Code

//package com.java2s;
/**//from   ww w  .jav a 2 s. c o  m
 * Syncnapsis Framework - Copyright (c) 2012-2014 ultimate
 * 
 * This program is free software; you can redistribute it and/or modify it under the terms of
 * the GNU General Public License as published by the Free Software Foundation; either version
 * 3 of the License, or any later version.
 * 
 * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 * without even the implied warranty of MECHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU General Public License for more details.
 * 
 * You should have received a copy of the GNU General Plublic License along with this program;
 * if not, see <http://www.gnu.org/licenses/>.
 */

public class Main {
    /**
     * {@link Math#round(double)}-like operation for integers preserving the given number of digits
     * in contrary to {@link MathUtil#round(int, int)} where cut-of-digits are specified:<br>
     * <code>return round(a, getDigits(a) - preserveDigits)</code>
     * 
     * @param a - a value
     * @param preserveDigits - the number of digits to preserve
     * @return the new value
     */
    public static int round2(int a, int preserveDigits) {
        return round(a, getDigits(a) - preserveDigits);
    }

    /**
     * Modification of {@link Math#round(double)} taking an additional argument representing the
     * requested accuracy in the following way:<br>
     * <code>double fac = Math.pow(10, digits);<br>
     * return fac * Math.round(a / fac);</code>
     * 
     * @param a - a value
     * @param cutOfDigits - the number of digits to shift the value before and after rounding
     * @return the new value
     */
    public static double round(double a, int cutOfDigits) {
        double fac = Math.pow(10, cutOfDigits);
        return fac * Math.round(a / fac);
    }

    /**
     * {@link Math#round(double)}-like operation for integers, e.g.:
     * <ul>
     * <li>1234, 3 --> 1000 (like floor, since digits are < 5)</li>
     * <li>1234, 2 --> 1200 (like floor, since digits are < 5)</li>
     * <li>1234, 1 --> 1230 (like floor, since digits are < 5)</li>
     * <li>5678, 3 --> 6000 (like ceil, since digits are >= 5)</li>
     * <li>5678, 2 --> 5700 (like ceil, since digits are >= 5)</li>
     * <li>5678, 1 --> 5680 (like ceil, since digits are >= 5)</li>
     * </ul>
     * Some "unusual" cases:
     * <ul>
     * <li>1234, 5 --> 0 (like floor, since digits are < 5)</li>
     * <li>1234, 4 --> 0 (like floor, since digits are < 5)</li>
     * <li>1234, 0 --> 1234 (like floor, since digits are < 5)</li>
     * <li>1234, -1 --> 1234 (like floor, since digits are < 5)</li>
     * <li>5678, 5 --> 100000 (like ceil, since digits are >= 5)</li>
     * <li>5678, 4 --> 10000 (like ceil, since digits are >= 5)</li>
     * <li>5678, 0 --> 5678 (like ceil, since digits are >= 5)</li>
     * <li>5678, -1 --> 5678 (like ceil, since digits are >= 5)</li>
     * </ul>
     * 
     * @param a - a value
     * @param cutOfDigits - the number of digits to "cut of"
     * @return the new value
     */
    public static int round(int a, int cutOfDigits) {
        if (cutOfDigits <= 0)
            return a;
        int fac = 1;
        while (--cutOfDigits >= 0)
            fac *= 10;
        int ret = (a / fac) * fac;
        if (a - ret > fac / 2)
            ret += fac;
        return ret;
    }

    /**
     * Get the number of digits for the given value
     * 
     * @param a - a value
     * @return the number of digits
     */
    public static int getDigits(int a) {
        int digits = 0;
        while (a != 0) {
            digits++;
            a /= 10;
        }
        return digits;
    }
}

Related

  1. round(final double value, final int numDecimals)
  2. round(final double x, final int digits)
  3. round2(double d)
  4. round2(double num)
  5. round2(final double arg)
  6. round2Places(Double input)
  7. round5(final double value)
  8. round_double(double d)
  9. round_nearestmultipleof5(double value)