Подтвердить что ты не робот

Почему код целочисленного кода дает неверный ответ?

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

float res = quantity / standard;

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

Всюду в мире:

13.6 = 6800 / 500;

Java:

13.0 = 6800 / 500;

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

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

4b9b3361

Ответ 1

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

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

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

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

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

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

float f = 6800 / 500;

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

float f = 6800f / 500;
              ^

Ответ 2

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

double d = (double) 6800 / 500;

или

double d = 6800.0 / 500;

Ответ 3

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

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

Ответ 4

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

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

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

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