2010-01-21 62 views
17

no he encontrado ningún método nativo para hacer esto, así que creé mi propia en una clase de ayuda:Calcular el porcentaje de bigdecimals

public static BigDecimal percentage(BigDecimal base, BigDecimal pct){ 
    return base.multiply(pct).divide(new BigDecimal(100)); 
} 

pero no me gusta bastante, me pregunto si la API tiene algo similar. La clase Number (ancestro de BigDecimal) sería un lugar agradable.

+5

¿Por qué no te gusta? ¿Qué pasa con eso? –

+2

Pienso en cuántos otros programadores van a crear el mismo método, es DRY. Incluso la calculadora más simple tiene un botón de porcentaje. No puedo entender por qué la clase no lo tiene. –

+1

@LluisMartinez: El problema aquí es la precisión. Cuando divides dos '' BigDecimal''s (lo que haces al calcular el porcentaje), deberías proporcionar un modo de redondeo apropiado. Supongo que es por eso que la clase no proporciona un método '' percentage() ''. Basta con mirar '' BigDecimal'', hay seis '' divide() '' métodos con diferentes firmas. Al proporcionar un método porcentual, tendría que agregar otros 6 o más métodos y, en última instancia, eso inflaría toda la implementación. – user1438038

Respuesta

7

Siéntase libre de subclase BigDecimal y añada ese método. Más allá de eso, ¿qué esperas? Sabes dónde encontrar la API y confirmas que la clase en la que te gustaría tener ese método no lo hace. Personalmente, diría que la funcionalidad es tan trivial que no tendría mucho sentido tenerla en la API estándar.

+4

Sí, es trivial pero se usa muy a menudo, al menos en cierto tipo de aplicaciones. –

+1

Estoy de acuerdo. Aunque es trivial, pero se usa mucho – vsingh

11

No creo que haya una API para eso (realmente no es necesario).
Su solución costuras bueno para mí, tal vez sólo tiene que añadir la constante ONE_HUNDRED:

public static final BigDecimal ONE_HUNDRED = new BigDecimal(100); 

public static BigDecimal percentage(BigDecimal base, BigDecimal pct){ 
    return base.multiply(pct).divide(ONE_HUNDRED); 
} 

probablemente no tanto la ganancia, sólo si llama muy menudo

finalmente por decirlo de alguna clase Util ...

+1

BigDecimal tiene CERO, UNO y DIEZ. Pero no cientos o miles. ¡Curioso! –

+0

@Lluis: 'ZERO' y' ONE' son bastante antiguos (Java 1.2); 'TEN' también se está haciendo viejo, desde Java 5; tal vez obtengamos HUNDERT con Java 7 :-) pero no es gran cosa para crearlo de todos modos ... ¡Saludos! –

2

Véase también DecimalFormat. Puede usar el método de fábrica del padre NumberFormat.getPercentInstance() como se muestra here, herey otros.

+2

Si bien este enlace puede responder la pregunta, es mejor incluir las partes esenciales de la respuesta aquí y proporcionar el enlace de referencia. Las respuestas de solo enlace pueden dejar de ser válidas si la página vinculada cambia. - [De la crítica] (/ review/low-quality-posts/17666153) –

5

Es posible que desee implementar la división por 100 usando BigDecimal.scaleByPowerOfTen(-2).

Se suma si lo haces un millón de veces. Es mucho más rápido en mi experiencia.

También hay un método similar BigDecimal.movePointLeft(2) - ver the other thread para más detalles y decidir cuál funciona mejor para usted.

Cuestiones relacionadas