2010-07-21 14 views
5
new BigDecimal("37146555.53880000").divide(new BigDecimal("1000000")).scale() 

Esto devuelve 10. Pero de acuerdo con el API, el divide método:Scale() del método Divide en BigDecimal

Devuelve una BigDecimal cuyo valor es (este/divisor), y cuya preferido escala es (this.scale() - divisor.scale());

lo tanto, en este caso, 37146555.53880000's escala es 8, y la escala 1000000 's es 0. Por lo tanto, el resultado debe tener una escala de 8, no 10.

¿Qué me falta aquí?

Gracias

Respuesta

2

El resultado real es 37.1465555388, cuya escala debe ser 10 para que sea exacto.

Lo que JavaDoc dice es que la escala preferida es la diferencia, lo que significa que si el resultado no necesita ser realmente 10, entonces trataría de hacerlo 8. Por ejemplo, si hubieras dividido por 2, la escala también es 0, el resultado hubiera sido 18573277.76940000 (escala 8).

EDIT: pequeña adition - puede forzar la división de una escala determinada mediante el uso de los métodos de dividir sobrecargados:

  • divide(BigDecimal, RoundingMode) que dará un BigDecimal con escala de this y el valor redondeado utilizando el método de redondeo especificado si el resultado realmente necesitaría más decimales para ser exactos.

  • divide(BigDecimal, scale, RoundingMode) que dará un BigDecimal con escala especificada, y el valor redondeado por el método especificado si es necesario.

Esto podría ser útil si su división por un número que sabe puede causar decimales periódicos, al igual que 3 (1/3 = 0.333333 ...) ya que, si eso sucede, el simple división lanzará una excepción. Limitarlo a un número máximo de decimales lo ayudará a evitar la excepción, pero hará que sus cálculos sean menos precisos.

1

Estas escalas son los utilizados por los métodos que devuelven aritmética exacta resultados; excepto que una división exacta puede tener que usar una escala mayor desde , el resultado exacto puede tener más dígitos. Por ejemplo, 1/32 es 0.03125.