Hubo un problema al manejar la verificación del monto del pago en los últimos dos días. Utilicé el método igual de BigDecimal para comparar si las dos cantidades son iguales, lo que resultó en un error en la comparación de la cantidad (como la comparación entre 3.0 y 3.00, etc.).
[Nota: Los siguientes son sobre Sun JDK versión 1.4.2 como ejemplo. La implementación de otras versiones puede no ser consistente, por favor ignórela]
Primero, echemos un vistazo al método igual de BigDecimal:
public boolean iguales (objeto x) {if (! (x instancia de bigDecimal)) return false; bigDecimal xDec = (bigDecimal) x; return scale == xdec.scale && intval.equals (xDec.intval); }Puede ver que el método Euquals de BigDecimal es determinar primero el tipo de datos que se comparará. Si los tipos de objetos son consistentes, se determina al mismo tiempo si la precisión (escala) y el valor (el método igual de BigInteger) son consistentes.
De hecho, ya está muy claro en Javadoc: "Compara este BigDecimal con el objeto especificado para la igualdad. A diferencia de comparación, este método considera dos objetos BigDecimal iguales solo si son iguales en valor y escala (por lo tanto, 2.0 no es igual a 2.00 cuando se compara con este método)". ¡Simplemente no presté atención!
Echemos un vistazo al método Compareto:
Public int Compareto (BigDecimal Val) {/ * Optimización: se ejecutaría bien sin las siguientes tres líneas */int sigdiff = signum () - val.signum (); if (sigdiff! = 0) return (SigDiff> 0? 1: -1);/ * si firma Signs, escala y compare intvals */bigDecimal arg [] = newdecimal [2]; esto; arg [1] = val; matchscale (arg); return arg [0] .intval.compareto (arg [1] .intval); } Puede ver que hay un procesamiento de escala de coincidencia en este método, lo que significa convertir el objeto con baja precisión con alta precisión y luego compararlo (también el método Compareto de BigInteger). La implementación de MatchScale es la siguiente:
Private static void MatchScale (BigDecimal [] val) {if (val [0] .Scale <val [1] .scale) val [0] = val [0] .setscale (val [1] .scale); else if (val [1] .scale <val [0] .scale) val [1] = val [1] .setscale (val [0] .scale); } Hacer una prueba simple:
System.out.println (nuevo BigDecimal ("1.2"). Equals (new BigDecimal ("1.20")))); // emitir falsesystem.out.println (new BigDecimal ("1.2"). Compareto (new BigDecimal ("1.20")) == 0); // Salida verdadera También notó que el constructor BigDecimal anterior se pasa en las cuerdas. Si el tipo de número aprobado, ¿qué pasará? Puede probarlo usted mismo y analizar las razones:
System.out.println (nuevo BigDecimal ("1.2"). Equals (new BigDecimal ("1.20")))); // emitir falsesystem.out.println (new BigDecimal ("1.2"). Compareto (new BigDecimal ("1.20")) == 0); // emitir verdadero sistema.out.println (nuevo BigDecimal (1.2) .equals (new BigDecimal ("1.20"))); // Salida ¿Es? System.out.println (new BigDecimal (1.2) .compareto (new BigDecimal ("1.20")) == 0); // es la salida? System.out.println (nuevo BigDecimal (1.2) .equals (nuevo BigDecimal (1.20))); // es la salida? System.out.println (nuevo BigDecimal (1.2) .compareto (nuevo BigDecimal (1.20)) == 0); // es la salida?La conclusión final es: para la comparación de tamaño de BigDecimal, el uso del método igual no solo comparará el tamaño del valor, sino que también comparará la precisión de los dos objetos. El método Compareto no comparará la precisión, sino que solo comparará el tamaño del valor.
Finalmente, me desprecio. ¡He usado el lenguaje Java durante tantos años y ni siquiera he descubierto el sentido común básico!
El artículo anterior habla brevemente sobre la diferencia entre los iguales y comparación de BigDecimal en Java es todo el contenido que comparto con ustedes. Espero que pueda darle una referencia y espero que pueda apoyar más a Wulin.com.