Here you can find the source of round2(int a, int preserveDigits)
return round(a, getDigits(a) - preserveDigits)
Parameter | Description |
---|---|
a | - a value |
preserveDigits | - the number of digits to preserve |
public static int round2(int a, int preserveDigits)
//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; } }