2011-09-02 12 views
25

Tengo una división muy simple en Java (que es una cantidad de producto/producción por hora), sin embargo cada vez que hago esta división se producen errores extraños:¿Por qué el código de división entera da la respuesta incorrecta?

float res = quantity/standard; 

he intentado la división anterior con varios valores y me siempre reciben errores, sin embargo el que he intentado en todas partes y conseguido la derecha era la siguiente:

en todas partes del mundo:

13.6 = 6800/500; 

Java:

13.0 = 6800/500; 

Investigué BigDecimal y BigInteger, pero no encontré la manera de crear esta división con ellos, ¿hay alguna otra forma de hacer esta división en Java sin errores de precisión?

Cualquier ayuda será muy apreciada.

+8

"En todas partes del mundo" no se puede volver a asignar el valor de literales ;-) –

+0

Debe utilizar 'double' a menos que exista una necesidad específica de usar' flotador '. – starblue

+3

"¿En todas partes del mundo" excluye C, C++? – djechlin

Respuesta

71

Está dividiendo enteros, lo que significa que está utilizando división entera.

En la división de enteros, la parte fraccional del resultado se descarta.

Prueba las siguientes:

float res = (float) quantity/standard; 
      ^^^^^^^ 

Las fuerzas por encima de la numerador a ser tratado como un float que a su vez promueve el denominador para flotar, así, y un flotador-división se realiza en lugar de un int-división .

Observe que si está tratando con literales, puede cambiar

float f = 6800/500; 

para incluir el sufijo f para que el denominador un flotador:

float f = 6800f/500; 
      ^
+3

Otro método común es multiplicar el numerador o el denominador por 1.0. Por cierto, casi no hay ninguna razón para usar float en vez de double, a menos que realmente te importe ahorrar 4 bytes. –

+4

@Paul: así que no hay razón para usar int en lugar de long, a menos que ... [:-) –

+0

@Carlos, tal vez no en Java (en realidad, no lo sé), pero en C o C++, int puede ser considerablemente más rápido que largo, mientras que gracias a los "coprocesadores matemáticos" (algunos recuerdan cuando estos eran chips separados) los dobles son a menudo más rápidos que los flotadores porque no tienen que ser convertidos. –

3

Si preocupados por la precisión lo haría sugiera usar double que tiene más del doble de dígitos de precisión. Sin embargo, el punto flotante solo representa con precisión fracciones que son una suma o potencias de 0.5. Esto significa que 0.6 solo está aproximadamente representado. Esto no tiene que ser un problema con el redondeo apropiado.

double d = (double) 6800/500; 

o

double d = 6800.0/500; 
+0

¿Hay alguna diferencia de rendimiento entre doble y flotante? ... He estado leyendo un poco y me preocupa un poco el uso de la memoria, la máquina en la que se implementará el software es bastante antigua –

+0

double usa 4 bytes más. Si la memoria es muy estrecha, puede valer la pena usar '' flotante '' y si tiene un millón de estos, podría ahorrar 4 MB. Si no tiene millones de estos, probablemente no valga la pena preocuparse. –

+1

Nah, la máquina no es tan vieja –

0

hi intente éste puede ayudar a cumplir su requisito

double percent=(7819140000l-3805200000l)*100f/7819140000l; 
 

 
public String format_Decimal(double decimalNumber) { 
 
\t \t NumberFormat nf = NumberFormat.getInstance(); 
 
\t \t nf.setMaximumFractionDigits(5); 
 
\t \t nf.setMinimumFractionDigits(2); 
 
\t \t nf.setRoundingMode(RoundingMode.HALF_UP); 
 
\t \t String x = nf.format(decimalNumber); 
 
\t \t return x; 
 
\t }

0

En mi caso yo estaba haciendo esto:

double a = (double) (MAX_BANDWIDTH_SHARED_MB/(qCount+1)); 

En lugar de la "correcta":

double a = (double)MAX_BANDWIDTH_SHARED_MB/(qCount+1); 
Cuestiones relacionadas