Comparte 4 formas de calcular la cantidad de BigDecimal

introducción básica

El cálculo del importe se suele basar en el redondeo a 2 decimales, si es función interna de su propio sistema, el número de dígitos del importe es generalmente fijo, y se reserva el mismo número de dígitos en la lógica normal de suma, resta, multiplicación y división, pero multiplicación y división Relativamente especial, se pueden calcular más puntos decimales en la parte de cálculo de decimales.Si necesita comparar los datos de la cantidad calculada con un cierto valor, debe considerar que la parte de datos es completamente igual. Para hacer frente a esta situación hay dos tipos comunes de lógica de datos. El primero es que cuando dos valores se encuentran, se toma el umbral de error del valor absoluto. Si está dentro del rango de umbral permitido (por ejemplo , ambos valores tienen un máximo de 2 decimales, el umbral se establece en 0.0001 ), se consideran iguales; el segundo es conocer el método de cálculo utilizado en el proceso de cálculo de la cantidad, y utilizar un cálculo unificado método para calcular el mismo resultado.

Una función implementada el año pasado pasó a utilizar una variedad de métodos de cálculo para el número de lugares decimales, y hay alrededor de 4 tipos: redondeo, truncamiento, redondeo a cinco pares, redondeo positivo y negativo (en realidad hay más), el cálculo de estos datos se pueden obtener mediante el método de cálculo de código correspondiente. Esta vez, compartimos principalmente Math y BigDecimal. La referencia es la siguiente:

Matemáticas

@RunWith(JUnit4.class)
public class CalculateMathTest {

    /**
     * 保留2位小数,四舍五入
     */
    @Test
    public void round() {
        System.out.println(Math.round(12345.554 * 100) / 100D);
        System.out.println(Math.round(12345.555 * 100) / 100D);
        System.out.println(Math.round(12345.556 * 100) / 100D);
    }

    /**
     * 保留2位小数,正舍负入(ceil:反过来,正入负舍)
     */
    @Test
    public void floor() {
        System.out.println(Math.floor(123.554 * 100) / 100D);
        System.out.println(Math.floor(123.555 * 100) / 100D);
        System.out.println(Math.floor(123.556 * 100) / 100D);

        System.out.println(Math.floor(-123.554 * 100) / 100D);
        System.out.println(Math.floor(-123.555 * 100) / 100D);
        System.out.println(Math.floor(-123.556 * 100) / 100D);
    }

}

Traté de escribir una pequeña demostración y descubrí que la API proporcionada por Math, una clase de función matemática, no se enfoca en el cálculo de la cantidad, por lo que la API de cálculo de la cantidad encontrada es relativamente pequeña y el cálculo de la cantidad es relativamente inútil ( primero multiplique por 100 y luego divida por 100 para obtener la cantidad con decimales), lo que puede considerarse que satisface dos de los cuatro métodos de cálculo de la cantidad esta vez.

BigDecimal

/**
 * 保留2位小数,四舍五入
 */
@Test
public void round() {
    System.out.println(new BigDecimal("12345.554").setScale(2, BigDecimal.ROUND_HALF_UP));
    System.out.println(new BigDecimal("12345.555").setScale(2, BigDecimal.ROUND_HALF_UP));
    System.out.println(new BigDecimal("12345.556").setScale(2, BigDecimal.ROUND_HALF_UP));
}
/**
 * 保留2位小数,正舍负入
 */
@Test
public void floor() {
    System.out.println(new BigDecimal("12345.554").setScale(2, BigDecimal.ROUND_FLOOR));
    System.out.println(new BigDecimal("12345.555").setScale(2, BigDecimal.ROUND_FLOOR));
    System.out.println(new BigDecimal("12345.556").setScale(2, BigDecimal.ROUND_FLOOR));
    System.out.println();
    System.out.println(new BigDecimal("-12345.554").setScale(2, BigDecimal.ROUND_FLOOR));
    System.out.println(new BigDecimal("-12345.555").setScale(2, BigDecimal.ROUND_FLOOR));
    System.out.println(new BigDecimal("-12345.556").setScale(2, BigDecimal.ROUND_FLOOR));
}
/**
 * 保留2位小数,截位法
 */
@Test
public void down() {
    System.out.println(new BigDecimal("12345.554").setScale(2, BigDecimal.ROUND_DOWN));
    System.out.println(new BigDecimal("12345.555").setScale(2, BigDecimal.ROUND_DOWN));
    System.out.println(new BigDecimal("12345.556").setScale(2, BigDecimal.ROUND_DOWN));
}
/**
 * 保留2位小数,四舍六入五成双
 */
@Test
public void even() {
    System.out.println(new BigDecimal("12345.234").setScale(2, BigDecimal.ROUND_HALF_EVEN));
    System.out.println(new BigDecimal("12345.236").setScale(2, BigDecimal.ROUND_HALF_EVEN));
    System.out.println(new BigDecimal("12345.235").setScale(2, BigDecimal.ROUND_HALF_EVEN));
    System.out.println(new BigDecimal("12345.245").setScale(2, BigDecimal.ROUND_HALF_EVEN));
    System.out.println();
    System.out.println(new BigDecimal("12345.2450").setScale(2, BigDecimal.ROUND_HALF_EVEN));
    System.out.println(new BigDecimal("12345.2451").setScale(2, BigDecimal.ROUND_HALF_EVEN));
    System.out.println(new BigDecimal("12345.2452").setScale(2, BigDecimal.ROUND_HALF_EVEN));
    System.out.println(new BigDecimal("12345.2453").setScale(2, BigDecimal.ROUND_HALF_EVEN));
    System.out.println(new BigDecimal("12345.2454").setScale(2, BigDecimal.ROUND_HALF_EVEN));
    System.out.println(new BigDecimal("12345.2455").setScale(2, BigDecimal.ROUND_HALF_EVEN));
    System.out.println(new BigDecimal("12345.2456").setScale(2, BigDecimal.ROUND_HALF_EVEN));
    System.out.println(new BigDecimal("12345.2457").setScale(2, BigDecimal.ROUND_HALF_EVEN));
    System.out.println(new BigDecimal("12345.2458").setScale(2, BigDecimal.ROUND_HALF_EVEN));
    System.out.println(new BigDecimal("12345.2459").setScale(2, BigDecimal.ROUND_HALF_EVEN));
}

otras instrucciones

BigDecimal proporciona una variedad de métodos para el cálculo de montos, y la implementación de algunas reglas de cálculo también se declara (encapsula) por separado en la clase RoundingMode. El redondeo al 50% también se conoce como algoritmo interbancario. No es fácil de entender si cruza el borde Sí, esta práctica sacó varios resultados de ejemplo para entender, por lo que los puntos de conocimiento que resolví son:

(1) Mantener dos lugares decimales, por lo que debe tener una precisión de al menos 3 lugares decimales, y juzgar cómo llevar el segundo lugar decimal de acuerdo con el valor del tercer lugar decimal;

(2) Si el tercer dígito del punto decimal es 4, se redondeará, y si es 6, se redondeará por 1;

(3) Si el tercer dígito del punto decimal es 5, y no hay cuarto dígito decimal, entonces observe el segundo dígito decimal, si es un número base, agregue 1, y si es un número par, deséchelo;

(4) Si el tercer dígito del punto decimal es 5, y hay un cuarto lugar decimal, entonces observe el cuarto lugar decimal, si es 0, deséchelo, de lo contrario, agregue 1;

Entonces, aquí está el resultado de redondear a 50 y duplicar:

Comparte 4 formas de calcular la cantidad de BigDecimal Bienvenido a la plataforma de intercambio de experiencias personales de Chen Dongdong https://www.chendd.cn/blog/article/1649745859662635010.html 

Supongo que te gusta

Origin blog.csdn.net/haiyangyiba/article/details/130311739
Recomendado
Clasificación