2012-06-24 24 views
7

Estoy pensando en utilizar BigDecimal para comparar dos valores monetarios redondeados a 2 dígitos. Por ejemplo, espero que lo siguiente arroje 0 porque estoy comparando algo que debería redondear a 0.02 con algo que es 0.02. ¡Pero rinde -1! ¿Hay una manera correcta de hacer esto?BigDecimal en Java

Esto también debería funcionar para números más grandes como 123.45 vs 123.4534 ... que debería rendir 0 cuando se usa "compareTo".

He intentado utilizar el contexto matemático, pero no parece elegante ... ¿hay una forma correcta?

BigDecimal spread = new BigDecimal(0.01934); 
spread.setScale(2, RoundingMode.HALF_EVEN); 
System.out.format("0.0193 ? 0.02 = %d\n", spread.compareTo(new BigDecimal(0.02))); 

y la solución es:

BigDecimal spread = new BigDecimal(0.01934).setScale(2, RoundingMode.HALF_EVEN); 
BigDecimal loSpread = new BigDecimal(0.02).setScale(2, RoundingMode.HALF_EVEN); 
System.out.format("0.0193 ? 0.02 = %d\n", spread.compareTo(loSpread)); 

Respuesta

5

0,02 consigue evaluaron a

java.math.BigDecimal = 0.0200000000000000004163336342344337026588618755340576171875 

Tienes que setScale (2, RoundingMode.HALF_EVEN) allí también.

+0

Esa es otra forma de obtener un número exacto de coma flotante. 1+. –

+0

Tuve que usar ambas ideas aquí para hacerlo bien. Publicará el código correcto. – fodon

10

En primer lugar, BigDecimal es inmutable. Debe devolver el resultado de su llamada al método setScale:

spread = spread.setScale(2, RoundingMode.HALF_EVEN); 

siguiente que debe mejorar la precisión de la segunda BigDecimal ya que está siendo deriva de un doble - no es una entidad muy precisa. Así que trate de una cadena:

spread.compareTo(new BigDecimal("0.02")) 
+0

Esto se usa para comparar precios. Pueden tener una instancia de dobles. – fodon

+0

@fodon: Entonces el usuario desconocido tiene parte de su respuesta para usted, y yo tengo la otra parte (en cuanto a que BigDecimal es inmutable). –

+1

He revertido la edición no válida. Amigos, por favor, comente o brinde una respuesta adicional si no está satisfecho con la respuesta que ve. –

Cuestiones relacionadas