¿Por qué el código de división entera da la respuesta incorrecta?


Tengo una división muy simple en Java (es una cantidad de producto / producción por hora), sin embargo cada vez que hago esta división recibo errores extraños:

float res = quantity / standard;

He intentado la división anterior con varios valores y siempre obtengo errores, sin embargo, el que he intentado en todas partes y acertado fue este:

En todas partes del mundo:

13.6 = 6800 / 500;

Java:

13.0 = 6800 / 500;

He investigado BigDecimal y BigInteger, sin embargo, no he encontrado una manera de crear esto división con ellos, ¿hay alguna otra forma de hacer esta división en Java sin tener errores de precisión??

Cualquier ayuda será muy apreciada.

Author: Peter Lawrey, 2011-09-02

4 answers

Estás dividiendo enteros, lo que significa que estás usando división de enteros.

En la división entera la parte fraccionaria del resultado es desechada.

Intente lo siguiente:

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

Lo anterior obliga al numerador a ser tratado como un float que a su vez promueve que el denominador también flote, y se realiza una división flotante en lugar de una división int.

Tenga en cuenta que si está tratando con literales, puede cambiar

float f = 6800 / 500;

Para incluir la f sufijo para hacer que el denominador sea flotante:

float f = 6800f / 500;
              ^
 71
Author: aioobe,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-05-28 06:29:41

Si te preocupa la precisión, sugeriría usar double que tiene más del doble del número 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á representado aproximadamente. Esto no tiene que ser un problema con el redondeo apropiado.

double d = (double) 6800 / 500;

O

double d = 6800.0 / 500;
 3
Author: Peter Lawrey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-09-02 17:08:24

Hola probar este puede ayudar a ful su requisito

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

public String format_Decimal(double decimalNumber) {
		NumberFormat nf = NumberFormat.getInstance();
		nf.setMaximumFractionDigits(5);
		nf.setMinimumFractionDigits(2);
		nf.setRoundingMode(RoundingMode.HALF_UP);
		String x = nf.format(decimalNumber);
		return x;
	}
 0
Author: Chandu D,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-09-02 06:55:44

En mi caso estaba haciendo esto:

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

En lugar del "correcto" :

double a = (double)MAX_BANDWIDTH_SHARED_MB/(qCount+1);
 0
Author: Felipe Volpato,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-01-12 10:58:17