Почему код целочисленного деления дает неправильный ответ? - PullRequest
27 голосов
/ 02 сентября 2011

У меня очень простое деление на Java (это количество продукта / производство в час), однако всякий раз, когда я делаю это деление, я получаю странные ошибки:

float res = quantity / standard;

Я пробовал вышеупомянутое деление с несколькими значениями, и я всегда получаю ошибки, однако единственное, что я пробовал во всех других местах и ​​получил право, было так:

Везде в мире:

13.6 = 6800 / 500;

Java:

13.0 = 6800 / 500;

Я исследовал BigDecimal и BigInteger, однако я не нашел способа создать это разделение с ними, есть ли другой способ сделать это разделение в Java без ошибок точности ??

Любая помощь будет принята с благодарностью.

Ответы [ 4 ]

74 голосов
/ 02 сентября 2011

Вы делите целые числа, что означает, что вы используете целочисленное деление .

При целочисленном делении дробная часть результата отбрасывается.

Попробуйте следующее:

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

Вышеприведенное заставляет числитель обрабатываться как float, что, в свою очередь, также способствует перемещению знаменателя, и вместо деления int выполняется деление на число с плавающей точкой..

Обратите внимание, что если вы имеете дело с литералами, вы можете изменить

float f = 6800 / 500;

на суффикс f, чтобы знаменатель стал плавающим:

float f = 6800f / 500;
              ^
3 голосов
/ 02 сентября 2011

Если вы беспокоитесь о точности, я бы предложил использовать double, у которого число цифр точности более чем вдвое. Однако с плавающей запятой только точно представляют дроби, которые являются суммой или степенями 0,5. Это означает, что 0,6 представлен только приблизительно. Это не должно быть проблемой с соответствующим округлением.

double d = (double) 6800 / 500;

или

double d = 6800.0 / 500;
1 голос
/ 12 января 2017

В моем случае я делал это:

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

Вместо «правильного»:

double a = (double)MAX_BANDWIDTH_SHARED_MB/(qCount+1);
0 голосов
/ 02 сентября 2016

привет, попробуйте, это может помочь вашему требованию

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;
	}
...