2011-10-21 9 views
6

Al calcular y manipular probabilidades en Java, y luego expresarlas como porcentajes, ¿cuál es la mejor estructura de datos para representarlas?¿Cuál es la forma correcta de representar y manipular probabilidades y porcentajes en Java?

Los nativos double y float no parecen candidatos particularmente ideales, ya que tienen problemas de redondeo que pueden introducir errores cuando el redondeo ocurre varias veces y se agrava.

BigInteger funciona bien para calcular permutaciones y combinaciones, y BigDecimal parece que podría ser un buen candidato para los valores no enteros, pero ¿hay algo más adecuado para tratar los porcentajes?

Nota: En este caso, las probabilidades que se calculan son de naturaleza similar a las que involucran mazos de cartas, pero con cientos de cartas. Para los más inclinados a las matemáticas, estoy trabajando específicamente con Multivariate Hypergeometric_distributions.

+0

¿Siempre serán porcentajes enteros? Si es así, usa un int. BigInteger es exagerado porque su número no va a ser más grande que lo que puede caber en un número entero normal. –

+0

No, los porcentajes generalmente estarán en el rango de [0,1], pero se mostrarán en un formato como '23.29945%'. 'BigInteger' se usa para cálculos factoriales. – cdeszaq

Respuesta

5

Cuando se trata de probabilidades, sospecharía te beneficiarías trabajando con fracciones.

Tener un vistazo a esta pregunta:

de lo contrario creo BigDecimal es su mejor opción. Sin embargo, tenga cuidado con java.lang.ArithmeticException: Non-terminating decimal expansion;

+0

Mantener las cosas como fracciones hasta el último minuto (y luego cambiar a un porcentaje) parece que podría ser una buena idea. +1 – cdeszaq

+0

No tendrá problemas de redondeo al menos :) – aioobe

0

Esto es lo que haría con un doble, creo que el uso de un doble sería el mejor para conseguir un buen valor con ciento ...

import java.text.NumberFormat; 
//instance variable: 
private static NumberFormat percent = NumberFormat.getPercentInstance(); 

//inside any method or event: 
myAprValue = userInput/100; 
percent = new DecimalFormat("0.0#%"); 

String st = percent.format(myAprValue); 
Cuestiones relacionadas